Spring-bean的生命周期
标准bean生命周期
Bean工厂实现应该尽可能支持标准Bean生命周期接口。整套初始化方法及其标准顺序如下:
BeanNameAware.setBeanName,
BeanClassLoaderAware.setBeanClassLoader,
BeanFactoryAware.setBeanFactory,
org.springframework.context.EnvironmentAware.setEnvironment,
org.springframework.context.EmbeddedValueResolverAware.setEmbeddedValueResolver,
org.springframework.context.ResourceLoaderAware.setResourceLoader,
org.springframework.context.ApplicationEventPublisherAware.setApplicationEventPublisher,org.springframework.context.MessageSourceAware.setMessageSource,
org.springframework.context.ApplicationContextAware.setApplicationContext,
org.springframework.web.context.ServletContextAware.setServletContext,
org.springframework.beans.factory.config.BeanPostProcessor.postProcessBeforeInitialization, // 实例化之前
InitializingBean.afterPropertiesSet, //实例化之后
org.springframework.beans.factory.support.RootBeanDefinition.getInitMethodName, // 初始化方法
org.springframework.beans.factory.config.BeanPostProcessor.postProcessAfterInitialization, // 初始化之后
org.springframework.beans.factory.config.DestructionAwareBeanPostProcessor.postProcessBeforDestruction, // 关闭容器,销毁bean之前
DisposableBean.destroy,
org.springframework.beans.factory.support.RootBeanDefinition.getDestroyMethodName
bean生命周期分析
从ClassPathXmlApplicationContext的构造函数开始作为入口分析:
整个生命周期大致如图所示:
bean初始化准备工作:
在obtainFreshBeanFactory方法中先loadBeanDefinitions加载bean定义,然后创建beanFactory实例,以及其他一些系统必要组件的加载
开始生命周期
- 如果有则调用
BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry - 如果有则调用
BeanFactoryPostProcessor的postProcessBeanFactory方法 - 如果有则调用
InstantiationAwareBeanPostProcessor接口的postProcessBeforeInstantiation前置方法
一个使用代理创建bean的机会,如果返回null,则开始正式创建bean
如果不为null,则调用postProcessAfterInitialization后置方法 - 实例化bean
- 如果有则调用
MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法 - 填充bean属性
- 如果有则调用
BeanNameAware的setBeanName方法 - 如果有则调用
BeanClassLoaderAware的setBeanClassLoader方法 - 如果有则调用
BeanFactoryAware的setBeanFactory方法 - 如果有则调用
BeanPostProcessor的postProcessBeforeInitialization前置方法 - bean的初始化
- 如果有则调用
InitializingBean的afterPropertiesSet方法 - 如果有则调用
BeanPostProcessor的postProcessAfterInitialization后置方法 - 如果有则调用
DestructionAwareBeanPostProcessor的requiresDestruction方法 - 如果有则调用
ApplicationContextAware的setApplicationContext方法
xxAware实现原理
以ApplicationContextAware为例:
其实还是利用BeanPostProcessor的能力,关键代码如下:
class ApplicationContextAwareProcessor implements BeanPostProcessor {
@Override
@Nullable
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)){
return bean;
}
AccessControlContext acc = null;
if (System.getSecurityManager() != null) {
acc = this.applicationContext.getBeanFactory().getAccessControlContext();
}
if (acc != null) {
AccessController.doPrivileged((PrivilegedAction