您的位置:首页 > 编程语言 > Java开发

Spring Bean

2016-04-11 22:56 260 查看

Spring IOC 容器中 Bean 的生命周期

1、通过构造器或工厂方法创建 Bean 实例:调用构造器

2、为 Bean 的属性设置值和对其他 Bean 的引用:调用 setter

3、调用BeanAware接口

如果Bean有实现BeanNameAware的接口那么对这些Bean进行调用

如果Bean有实现BeanFactoryAware接口的那么对这些Bean进行调用

如果Bean有实现ApplicationContextAware接口的那么对这些Bean进行调用

4、后置处理器Before Init

将 Bean 实例传递给 Bean 后置处理器的 postProcessBeforeInitialization 方法

5、如果bean实现IntializingBean了,调用它的afterPropertySet方法

6、调用 Bean 的初始化方法:init-method

7、后置处理器After Init

将 Bean 实例传递给 Bean 后置处理器的 postProcessAfterInitialization方法

8、使用Bean

9、当容器关闭时, 调用 Bean 的销毁方法:destroy-method。

自动装配 (bean标签的autowire属性)

作用:不明确配置,自动将某个bean 注入到另一个bean的属性当中

分类:

(1)byname:通过id 的名字来进行匹配,

(2)byType:通过类型来进行匹配

(3)constructor:根据java 源程序中定义的构造方法,再根据类型进行匹配。

(4)autodetect:完全交给spring管理, spring 则再根据constructor a byType的顺序进行匹配。

注:

自动装配的优先级低于手动装配

自动装配一般应用于快速开发中,但是不推荐使用,代码简单,但是一方面容易出错,另一方面也不方便后期的维护

bean作用域

默认情况下,容器是按照单例的方式去创建的bean,如果不想使用那么用(scope=” “)定义bean的使用范围

经常使用的是前两种:

(1)Singleton

默认的,单例

(2)Prototype

每次取出的都是新的对象,每次对该Bean请求(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的Bean实例。

(3)Request

bean的生命周期和一个http请求一直

(4)Session

在一个会话周期中有效

prototype作用域的Bean会导致在根据经验,对有状态的Bean应使用prototype作用域,而对无状态的Bean则应该使用singleton作用域。

对于具有prototype作用域的Bean,有一点很重要,即Spring不能对该Bean的整个生命周期负责。具有prototype作用域的Bean创建后交由调用者负责销毁对象回收资源。

简单的说:

singleton 只有一个实例,也即是单例模式

prototype访问一次创建一个实例,相当于new

应用场合:

1、需要回收重要资源(数据库连接等)的事宜配置为singleton,如果配置为prototype需要应用确保资源正常回收。

2、有状态的Bean配置成singleton会引发未知问题,可以考虑配置为prototype。

prototype默认lazy-init=true,只有在第一次getBean的时候才会实例化Bean

延迟加载

ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化(也就是依赖注入)。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的singleton bean。

<bean id="testBean" class="com.fhx.TestBean">


该bean默认的设置为:

<bean id="testBean" class="com.fhx.TestBean" lazy-init="false">


lazy-init=”false” 立退加载, 表示spring启动时,立刻进行实例化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: