1. bean生命周期
在BeanFactory接口的注释上, 有这么一段话:一个BeanFactory的实现应尽可能地支持标准的bean生命周期接口。并描述了bean生命周期的全套初始化方法及顺序:
Bean factory implementations should support the standard bean lifecycle interfaces as far as possible. The full set of initialization methods and their standard order is:
1. BeanNameAware's setBeanName
2. BeanClassLoaderAware's setBeanClassLoader
3. BeanFactoryAware's setBeanFactory
4. EnvironmentAware's setEnvironment
5. EmbeddedValueResolverAware's setEmbeddedValueResolver
6. ResourceLoaderAware's setResourceLoader (only applicable when running in an application context)
7. ApplicationEventPublisherAware's setApplicationEventPublisher (only applicable when running in an application context)
8. MessageSourceAware's setMessageSource (only applicable when running in an application context)
9. ApplicationContextAware's setApplicationContext (only applicable when running in an application context)
10. ServletContextAware's setServletContext (only applicable when running in a web application context)
11. postProcessBeforeInitialization methods of BeanPostProcessors
12. InitializingBean's afterPropertiesSet
13. a custom init-method definition
14. postProcessAfterInitialization methods of BeanPostProcessors
On shutdown of a bean factory, the following lifecycle methods apply:
1. postProcessBeforeDestruction methods of DestructionAwareBeanPostProcessors
2. DisposableBean's destroy
3. a custom destroy-method definition
spring中bean从创建到销毁,整个生命周期一共有几个阶段:
- 实例化
bean - 设置对象属性
- 检查
Aware相关接口并设置相关依赖,包括下面Aware接口:- BeanNameAware's setBeanName
- BeanClassLoaderAware's setBeanClassLoader
- BeanFactoryAware's setBeanFactory
- EnvironmentAware's setEnvironment
- EmbeddedValueResolverAware's setEmbeddedValueResolver
- ResourceLoaderAware's setResourceLoader (only applicable when running in an application context)
- ApplicationEventPublisherAware's setApplicationEventPublisher (only applicable when running in an application context)
- MessageSourceAware's setMessageSource (only applicable when running in an application context)
- ApplicationContextAware's setApplicationContext (only applicable when running in an application context)
- ServletContextAware's setServletContext (only applicable when running in a web application context)
BeanPostProcessor前置处理- 检查是否是
InitializaingBean以决定是否调用afterPropertiesSet方法 - 检查是否配置有自定义的
init-method方法 BeanPostProcessor后置处理- 注册必要的
Destruction相关回调接口
在销毁之前,生命周期接口方法如下:
- 是否实现
DisposableBean接口 - 是否配置有自定义的
destroy方法;
2. 提出问题
了解了上面的bean的生命周期之后,有一些疑惑需要先提出来:
- 生命周期的前10个调用方法,都是以
Aware结尾的接口方法,各个XXXAware接口作用是什么?对开发者来说有没有用? - 上面所有接口按照作用方式的不同如何分类?
- 开发者常见的涉及到
Bean生命周期的操作方式有哪些?即知道了bean的生命周期,对我们有什么用?如何用?