公开的生命周期流程
spring bean 的生命周期是怎样一个过程呢?
以下是BeanFactory java docs的生命周期截图:
接口说明
上面这些接口都有什么用呢?
BeanNameAware
如果一个bean实现此接口,会被自动设置beanName。beanName可以用于获取该bean的其他相关信息,例如BeanDefinition。
BeanClassLoaderAware
如果一个bean实现此接口,会被自动设置ClassLoader。classLoader可以用于加载类,spring会有许多自己的ClassLoader,你可能需要和它保持一致。
BeanFactoryAware
如果一个bean实现此接口,会被自动设置BeanFactory。beanFactory可以用于获取其他bean。
EnvironmentAware
如果一个bean实现此接口,会被自动设置Environment。environment可以用于获取配置属性、环境变量。
EmbeddedValueResolverAware
如果一个bean实现此接口,会被自动设置StringValueResolver。stringValueResolver可以用于解析占位符。
ResourceLoaderAware
如果一个bean实现此接口,会被自动设置ResourceLoader。resourceLoader可以用于获取Resource,扫描指定路径下的类时会用到。
ApplicationEventPublisherAware
如果一个bean实现此接口,会被自动设置ApplicationEventPublisher。applicationEventPublisher可以用于发布事件。
MessageSourceAware
如果一个bean实现此接口,会被自动设置MessageSource。messageSource可以用于支持国际化。
ApplicationContextAware
如果一个bean实现此接口,会被自动设置ApplicationContext。applicationContext是BeanFactory的子类,此接口类似于BeanFactoryAware。
ServletContextAware
如果一个bean实现此接口,会被自动设置ServletContext。servletContext可以用于获取web应用上下文信息。
BeanPostProcessor
如果一个bean实现此接口,它可以在所有的bean初始化之前和初始化之后对其进行处理。那么BeanPostProcessor会不会处理它自己呢,答案是不会。BeanPostProcessor是一类特殊的bean,使用BeanPostProcessor时,需要先从BeanFactory中取出BeanPostProcessor,然后通过接口ConfigurableBeanFactory.addBeanPostProcessor添加到BeanFactory中,再获取其他普通bean时,才会对其进行处理。在获取BeanPostProcessor过程中创建的bean,无法被BeanPostProcessor处理,因为在创建BeanPostProcessor时,这些bean已经被创建了,再次获取这些bean时会从缓存中读取。
InitializingBean
如果一个bean实现此接口,在所有属性都被设置之后,会调用其afterPropertiesSet,可以做一些自定义的初始化行为。
DestructionAwareBeanPostProcessor
如果一个bean实现此接口,在所有的bean被销毁时都会调用其postProcessBeforeDestruction方法。
DisposableBean
如果一个bean实现此接口,在bean被销毁时,会调用其destroy方法。
实现代码
那么spring是如何调用以上接口的呢?
AbstractAutowireCapableBeanFactory.invokeAwareMethods
此方法中实现了对BeanNameAware、BeanClassLoaderAware、BeanFactoryAware的调用。
ApplicationContextAwareProcessor.invokeAwareInterfaces
此方法中实现了对EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware的调用。
ServletContextAwareProcessor.postProcessBeforeInitialization
此方法中实现了对ServletContextAware、ServletConfigAware的调用。
AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization
此方法中实现了对BeanPostProcessor.postProcessBeforeInitialization的调用。
AbstractAutowireCapableBeanFactory.invokeInitMethods
此方法中实现了对InitializingBean.afterPropertiesSet的调用。
AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization
此方法中实现了对BeanPostProcessor.postProcessAfterInitialization的调用。
DisposableBeanAdapter.destroy
此方法中实现了对DestructionAwareBeanPostProcessor.postProcessBeforeDestruction、DisposableBean.destroy的调用。
隐含的生命周期流程
bean的生命周期包括实例化、初始化和销毁三个阶段。公开的生命周期只涉及到初始化和销毁两个阶段。在实例化阶段会依次调用以下接口:
InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation:在实例化之前处理MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation :在实例化之后处理InstantiationAwareBeanPostProcessor.postProcessPropertyValues:处理属性值