Bean的生命周期
先上一张流程图
从图中可以看出初始化bean的流程主要分为
- 实例化Bean
- Aware、BeanProcessor处理
- bean自己的init方法
- 注销bean时执行destroy-method方法
实例化Bean
实例化bean主要是用BeanWrapperImpl,其主要作用是对这个Bean进行包装。Bean的初始化主要是根据策略模式来进行选择是用JDK的动态代理或CGLib的动态代理来实现。关键代码如下:
/** Strategy for creating bean instances. */
private InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
try {
Object beanInstance;
final BeanFactory parent = this;
if (System.getSecurityManager() != null) {
beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->
getInstantiationStrategy().instantiate(mbd, beanName, parent),
getAccessControlContext());
}
else {
beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
}
BeanWrapper bw = new BeanWrapperImpl(beanInstance);
initBeanWrapper(bw);
return bw;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
}
}
在这里getInstantiationStrategy(),通过获取指定的动态代理策略来进行实例化
- 如何指定使用JDK的proxy?
spring5中貌似没有找到
使用Aware接口
Aware接口是一个具有具有感知能力的接口,其主要的子类分别是BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口,以上三个接口的方法都是在实例化完成后调用invokeAware实现
BeanPostProcessor增强
BeanPostProcessor是bean的增强器,是spring容器用于增强全部bean的类。主要是初始化的前置方法和后置方法,主要的子类是InstantiationAwareBeanPostProcessorAdapter在初始化前就对bean进行一个预处理,以便进行特殊处理
init-method()
init-method表示的是bean自身定义的初始化方法,只会作用于bean本身的方法。执行时机是在属性赋值后进行执行。主要有
- InitializingBean接口
- @init-method注解
- @PostConstruct,底层的实现是依赖于BeanPostProcessor
DisposableBean
销毁方法
总结
Bean初始化的过程如下:
- InstantiationAwareBeanPostProcessor的前置方法
- 实列化
1.1 根据实例化策略选择进行JDK反射或者CGlib反射
1.2 执行InstantiationAwareBeanPostProcessor的后置方法
1.3 bean的属性进行赋值 - Aware接口处理
- BeanProcessors接口的前置处理
- init-method方法进行处理
- BeanProcessors接口的后置处理
- 销毁方法