Spring中Bean的生命周期
一个Bean从建立到销毁,会历经几个执行阶段,如果使用BeanFactory来生成、管理Bean,
会尽量支持以下的生命周期。
@Bean的建立
由BeanFactory读取Bean定义文件,并生成各个Bean实例。
@属性注入
执行相关的Bean属性依赖注入
@BeanNameAware的setBeanName()
org.springframework.beans.factory.BeanNameAware
@BeanFactoryAware的setBeanFactory()
org.springFramework.beans.factory.BeanFactoryAware
@BeanPostProcessors的processBeforeInitializat ion()
org.springFramework.beans.factory.config.BeanPostProcessors
@InitializiongBean的afterPropertiesSet()
org.springframework.beans.factory.InitializingBean
@Bean定义文件中定义init-method
use "init-methd" to set method name e.g:
...
<bean id="helloBean" class="org.bearfly.bean.HelloBean" init-
method="initBean">
...
当代码运行到这个阶段的时候,就是执行initBean方法。
@BeanPostProcessors的processaAfterInitializat ion()
如果有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessor实例
的processaAfterInitializat ion()方法。
@DisposableBean的destroy()
容器关闭 org.springframework.beans.factory.DisposableBean
@Bean定义文件中定义destroy-method
...
<bean id="helloBean" class="org.bearfly.bean.HelloBean" destroy-
method="destroyBean">
...
如果使用ApplicationContext来生成并管理Bean,在执行BeanfactoryAware的
setBeanFactory()阶段之后,若Bean类上有实现
org.springframework.context.ApplicationContextAware接口,则执行
setApplicationContext()方法,接着才继续进行BeanPostProcessors的
processBeforeInitializat ion()及之后的流程。
在非WEB应用程序中,若想在关闭容器之前调用Bean定义文件中Singleton的Bean所设置的
destroy方法,则可以执行AbstractApplicationConte xt的registerShutdownHook()方
法,并向JVM注册相关方法,例如:
AbstractApplicationConte xt context = new ClassPathXmlApplicationC ontext
("beans-config.xml");
...
context.registerShutdownHook();
//执行应用程序
在应用程序结束之前,Bean定义文件上所设置的destroy方法将会被调用执行。
如果使用BeanFactory,只有在使用getBean()方法真正取得Bean时,才会做实例化的动
作.如果使用ApplicationContext,则会预先针对Bean定义文件的内容,将所有的Bean实
例化。如果这不是你想要的,刚可以在<bean>上设置"lazy-init"属性
为"true,ApplicationContext 就不会在启动的时候针对该Bean作实例化的动作,例如:
<bean id="some" class="org.bearfly.bean.Some lazy-init="true">
...
</bean>