在传统的java应用中,JavaBean的生命周期一般都是浅化理解,就是在在Java中使用关键字new把Bean进行实例化,然后Bean就可以使用了,一旦不使用了,Java会自动进行垃圾回收。
如果是在springBean里面,Bean的生命周期就显得非常复杂,我把它详细了解了一下,分为十个步骤:
- Bean的实例化:spring启动后,会查找和加载需要被spring管理的Bean,并且实例化。
- Bean属性注入:Bean被实例化后对将Bean的引入和值注入到Bean的属性中。
- 调用BeanNameAware的setBeanName()方法:如果实现了BeanNameAware接口的话,Spring将Bean的Id传递给setBeanName()方法。
- 调用BeanFactoryAware的setBeanFactory()方法:如果Bean实现了BeanFactoryAware接口的话,spring就将调用他们的setBeanFactory()方法,将BeanFactory容器实例传入。
- 调用ApplicationContextAware的setApplicationContext方法:如果Bean实现了ApplicationContextAware接口的话,spring将调用Bean的setApplicationContext方法,将Bean所在用用上下文引用传入进来。
- 调用BeanPostProcessor的预初始化方法:如果Bean实现了BeanPostProcessor接口,spring将调用他们的postProcessBeforeInitialization()方法。
- 调用InitializingBean的afterPropertiesSet()方法:如果Bean实现了InitializingBean接口,spring将调用他们的afterPropertiesSet()方法,类似的,如果Bean使用init-method生命了初始化方法的话,这个方法也会被调用。
- 调用BeanPostProcessor的初始化后的方法:如果Bean实现了BeanPostProcessor接口,spring就将调用他们的postprocessAfterInitialization()方法。
- Bean可以使用了:这个时候,Bean就已经准备好了,可以被应用程序使用了,他们将一直驻留在应用的上下文中,直到应用的上下文被销毁。
- 调用DisposableBean的destory()方法:如果Bean实现DisposableBean接口,spring将嗲用他的destory()就扣方法,相同的,如果Bean使用了destory-method生命销毁方法,该方法也会被调用。
以上就是spring中Bean的核心接口和生命周期,但是翻阅JavaDoc文档发现除了以上接口外,还有另外的初始化过程设计的接口。
springBean生命周期的详解图
Bean完整的生命周期
文字解释如下:
----------初始化----------
BeanNameAware.setBeanName()在创建此Bean的Bean工厂设置Bean的名称,在普通属性设置之后再调用,在InitializingBean.afterPropertiesSet()方法之前调用。
BeanClassLoadeAware.setBeanClassLoader():在普通属性设置之后,InitializingBean.afterPropertiesSet()之前调用。
BeanFactoryAware.setBeanFactory():回调提供了自己的Bean实例工厂,在普通实行设置后,在InitializingBean.afterPropertiesSet()或者自定义初始化方法之前调用。
EnvironmentAware.setEnvironment():设置environment在组件使用是调用。
EmbeddedValueResolverAware.setEmbeddedValueResolver():设置StringValueResolver用来解决嵌入式的值域问题。
ResourceLoaderAware.setResourceLoader():在普通Bean对象之后调用,在afterPropertiesSet或者自定义的init-method之前调用,在ApplicationContextAware之前调用。
ApplicationEventPublisherAware.setApplicationEventPublisher():在普通Bean书香之后调用,在初始化调用afterpropertiesSet或者自定义初始化方法之前调用。在ApplicationContextAware之前调用。
MessageSourceAware.setMessageSource():在普通Bean属性之后条用,在初始化调用afterPropertiesSet或者自定义初始化方法之前调用,在A品牌力擦体哦那ContextAware之前调用。
ApplicationContextAware.setApplicationContext():在普通Bean对象生成之后调用,在InitializingBean.afterPropertiesSet之前调用或者用户自定义初始化方法之前。在ReasourceLoaderAware.setResourceLoader,ApplicationEcentPublisherAware.setApplicationEvenPublisher,MessageSourceAware之后使用。
ServketContextAware.setServletContext():运行时设置ServletContext,在普通Bean初始化后调用,在InitializingBean.aftePropertiesSet之前调用,在ApplicationContextAware之后调用。
注意:实在WebApplicationContext运行时。
BeanPostProcessor.postPricessBeforeInitialization():将此BeanPostProcessor应用与给定的新B额按实例,在任何Bean初始化回调方法(像是InitializingBean.afterPropertiesSet或者自定义的初始化方法)之前调用。这个Bean将要准备天秤属性的值。返回的Bean实例可能被普通对象包装,默认实现返回时一个Bean。
BeanPostProcessor.postPricessAfterInitialization():将此BeanPostProcessor应用与给定的新B额按实例,在任何Bean初始化回调方法(像是InitializingBean.afterPropertiesSet或者自定义的初始化方法)之后调用。这个Bean将要准备填充属性的值。返回的Bean实例可能被普通对象包装。
InitializingBean.afterPropertiesSet():被BeanFactory在设置所有Bean属性之后调用(并且满足BeanFactory和ApplicationContextAware)。
---------销毁----------
在BeanFactory关闭的时候,Bean 的生命周期会调用如下方法:
DestructionAwareBeanPostProcessor.postProcessBeforeDestruction():在销毁之前将此BeanProcessor应用于给定的Bean实例。能够调用自定义回调,像是DisposableBean的销毁和自定义销毁方法,这个回调仅仅适用于Factory中的单例Bean(包括内壁Bean)。