Spring 4 bean的生命周期,笔者总结为四个阶段:
1. Bean定义阶段
2. Bean实例化阶段
3. Bean初始化阶段
4. Bean销毁阶段
bean的定义阶段
SpringIOC提供了多种方式作bean的定义:
最为常见的就是通过@Componenet等注解、xml配置的
高级一点方式:@Import导入 ImportBeanDefinitionRegistrar的实现类
还有就是直接通过BeanFactory注册
其底层都是去注册一个BeanDefinition
为了拓展,Spring还提供了多种后置处理(PostProcessor),其中 BeanFactoryPostProcessor就是工作在这个阶段的。那么来看看,BeanFactoryPostProcessor的体系:
BeanDefinitionRegistryPostProcessor只有一个接口方法:
void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
可以对BeanDefinition进行增删改查(其实就是入参提供的能力)
BeanFactoryPostProcessor也只有一个接口方法:
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
同样地,入参beanFactory决定的这个接口方法能做什么(自行参考SpringAPI)
注意:在这个阶段,所有的bean都还没有实例化,只是存在Bean定义。
Bean实例化阶段
先来看看BeanPostProcessor体系:
SmartInstantiationAwareBeanPostProcessor 主要是给框架内部使用的,推荐使用其父接口。代理织入的时候使用到了参考: AbstractAutoProxyCreator。可以预测对象类型,指定构造器,获取早期对象。
InstantiationAwareBeanPostProcessor同样在这个阶段工作。
postProcessBeforeInstantiation如果返回了一个实例,将意味着实例化完成,直接跳过依赖注入,到BeanPostProcessor.postProcessAfterInitialization(所以代理在这里织入,因为postProcessBeforeInitialization不能保证所有的bean实例都经过)。
postProcessAfterInstantiation(Object bean, String beanName)如果返回true,则由容器注入属性。但是如果上面返回了实例,则不会被执行到。
postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)
可以作属性检查,检查是否所有的属性都已注入。
DestructionAwareBeanPostProcessor
用于销毁对象,例如调用对象的销毁方法,释放连接资源。
MergedBeanDefinitionPostProcessor
合并父子上下文Bean定义
一般的实例化流程:
1. 根据beanDefinition,选择实例化方式(静态构造方法、FactoryBean、无参构造器等)。
2. AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(返回true)
3. 设置属性——依赖注入(构造器注入不能解决循环依赖)
AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues
Bean初始化阶段
1. 调用BeanNameAware修改当前bean的名字
2. 调用BeanClassLoaderAware注入BeanClassLoader
3. 调用BeanFactoryAware注入BeanFactory
4. BeanPostProcessor.postProcessBeforeInitialization
InitDestroyAnnotationBeanPostProcessor调用@PostConstruct注解的初始方法
ApplicationContextAwareProcessor注入ApplicationContext相关的bean
(这里需要注意:InitDestroyAnnotationBeanPostProcessor是实现PriorityOrdered,而 ApplicationContextAwareProcessor没有指明,默认Ordered#LOWEST_PRECEDENCE)
其他BeanPostProcessor的处理
5. 调用InitializingBean#afterPropertiesSet
6. 调用用户自定义的初始化方法。例如通过@Bean(initMethod="")指定
7. BeanPostProcessor#postProcessAfterInitialization
AnnotationAwareAspectJAutoProxyCreator织入代理
其他BeanPostProcessor的处理
8. 保存到一级缓存DefaultSingletonBeanRegistry#singletonObjects。如果定义了销毁方法,则注册到DefaultSingletonBeanRegistry#disposableBeans包含指定destory方法,实现了DisposableBean接口的。
另外Lifecycle接口的实现bean是在所有的bean都已经实例化完成,放到缓存之后,统一由DefaultLifecycleProcessor去调度的。
到这里所有的bean就已经准备就绪,处于可用状态了。
Bean销毁阶段
Bean的销毁没怎么仔细研究。大体就是通过
在DisposableBeanAdapter#destroy 调用所有的DestructionAwareBeanPostProcessor.postProcessBeforeDestruction(Object bean, String beanName),其中@PreDestroy由InitDestroyAnnotationBeanPostProcessor处理。
实际上在注册DisposableBean时,注册的就是将bean封装成DisposableBeanAdapter
注:Spring容器中的单例对象,由于一直存在引用,所以是不会被JVM识别为垃圾对象的。会一直存在,直到应用被停止,由Spring去清理。又或者通过ConfigurableBeanFactory来调用destroyBean等方法移除。