生命周期
Bean 生命周期指的是单例模式下, Bean 的创建,应用,销魂的整个过程
先说结论: Bean 生命周期包含 4 个阶段:实例化、属性填充、初始化、销毁;在这 4 个阶段前后,有 BeanPostProcessor,Aware 等接口对这 4 个阶段进行增强。
一般面试的回答:
- BeaFactory 读取 Bean 定义,生成实例(实例化)
- setter 属性注入(属性填充)
- 若实现 BeanNameAware 接口,执行 setBeanName 方法
- 若实现 BeanFactoryAware 接口,执行 setBeanFactory 方法
- 若实现 BeanPostProcessor 接口,执行 processBeforeInitialization
- 执行 InitializingBean 的afterPropertiesSet()
- 执行 init-method (初始化)
- 执行 processAfterInitialization
- 执行 DisposableBean 的 destroy() 销毁
10.执行 Bean 定义文件中定义 destroy-method
源码分析
注意:部分代码进行了省略
实例化
实例化的过程就是获取完整 Bean 的过程,其中包含创建 Bean 的代理对象(Spring AOP)以及属性填充两个知识点。
通过 AbstractBeanFactory getBean 方法获取单例模式的 bean,里面调用抽象类AbstractAutowireCapableBeanFactory 的 createBean 方法
@Override
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
try {
return createBean(beanName, mbd, args);
}
}
}
createBean 里面有两种 Bean 实例化的方式,基于 AbstractAutowireCapableBeanFactory 类里面的方法进行分析:
-
通过调用 resolveBeforeInstantiation 方法,执行 postProcessBeforeInstantiation 返回一个代理的 bean,然后执行 applyBeanPostProcessorsAfterInitialization 方法。
知识点:Spring AOP 的具体实现
-
执行 doCreateBean 进行后面 bean 的实例化
先看第一种方式
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory {
@Override
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
try {
// 给 BeanPostProcessors 一个机会返回代理 Bean
Object bean = resolveBeforeInstantiation(beanName, mbdToUse