天天看点

@Bean 生命周期

bean生命周期:

@Bean 生命周期

实例bean

1.当调用者通过getbean(beanname)向容器请求某一个bean时,如果容器注册了org.springframework.beans.factory.config.instantiationawarebeanpostprocessor接口,在实例化bean之前,将调用接口的postprocessbeforeinstantiation()方法;

2.根据配置情况调用bean构造函数或工厂方法实例化bean;

3.如果容器注册了instantiationawarebeanpostprocessor接口,在实例化bean之后,调用该接口的postprocessafterinstantiation()方法,可在这里对已经实例化的对象进行一些"梳妆打扮";

4.如果bean配置了属性信息,容器在这一步着手将配置值设置到bean对应的属性中,不过在设置每个属性之前将先调用instantiationawarebeanpostprocessor接口的postprocesspropertyvalues()方法;

**

初始化和使用bean

1:beannameaware的setbeanname():

如果bean类有实现org.springframework.beans.beannameaware接口,工厂调用bean的setbeanname()方法传递bean的id。

2:beanfactoryaware的setbeanfactory():

如果bean类有实现org.springframework.beans.factory.beanfactoryaware接口,工厂调用setbeanfactory()方法传入工厂自身。

3:beanpostprocessors的processbeforeinitialization()

如果有org.springframework.beans.factory.config.beanpostprocessors和bean关联,那么其postprocessbeforeinitialization()方法将被将被调用。

4:initializingbean的afterpropertiesset():

如果bean类已实现org.springframework.beans.factory.initializingbean接口,则执行他的afterpropertiesset()方法

5:bean定义文件中定义init-method:

可以在bean定义文件中使用"init-method"属性设定方法名称例如:

如果有以上设置的话,则执行到这个阶段,就会执行initbean()方法

6:beanpostprocessors的processaafterinitialization()

如果有任何的beanpostprocessors实例与bean实例关联,则执行beanpostprocessors实例的processaafterinitialization()方法

beanpostprocessor后处理器定义了两个方法:

**       其一是postprocessbeforeinitialization()在第8步调用;其二是object postprocessafterinitialization(object bean, string beanname)方法,这个方法在此时调用,容器再次获得对bean进行加工处理的机会;**

**       如果在中指定bean的作用范围为scope="prototype",将bean返回给调用者,调用者负责bean后续生命的管理,spring不再管理这个bean的生命周期。如果作用范围设置为scope="singleton",则将bean放入到spring ioc容器的缓存池中,并将bean引用返回给调用者,spring继续对这些bean进行后续的生命管理;**

 销毁bean

此时,bean已经可以被应用系统使用,并且将保留在beanfactory中知道它不在被使用。有两种方法可以将其从beanfactory中删除掉

1:disposablebean的destroy()

在容器关闭时,如果bean类有实现org.springframework.beans.factory.disposablebean接口,则执行他的destroy()方法

2:bean定义文件中定义destroy-method

在容器关闭时,可以在bean定义文件中使用"destroy-method"属性设定方法名称,例如:

如果有以上设定的话,则进行至这个阶段时,就会执行destroy()方法,如果是使用applicationcontext来生成并管理bean的话则稍有不同,使用applicationcontext来生成及管理bean实例的话,在执行beanfactoryaware的setbeanfactory()阶段后,若bean类上有实现org.springframework.context.applicationcontextaware接口,则执行其setapplicationcontext()方法,接着才执行beanpostprocessors的processbeforeinitialization()及之后的流程。

代码:

beans.xml

result: