Spring 有一些常用扩展点,了解Spring Bean的生命周期,能够对spring宏观有一定的认识,这里尝试答一下。
Spring Bean的生命周期分为四个阶段。这里将spring Bean的四个阶段添加部分常用扩展点便于理解。
一、spring bean 四个阶段
1、实例化 instantiation(createBeanInstance)
2、属性赋值 Populate (populateBean)
3、初始化 Initialization(initializeBean)
4、销毁 Destruction(ConfigurableApplicationContext#close())
这个四个方法都放在AbstractAutowireCapableBeanFactory 中的doCreateBean的方法中,
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
}
//实例化
if (instanceWrapper == null) {
instanceWrapper = this.createBeanInstance(beanName, mbd, args);
}
.......................
try {
//属性赋值
this.populateBean(beanName, mbd, instanceWrapper);
//初始化
exposedObject = this.initializeBean(beanName, exposedObject, mbd);
} catch (Throwable var18) {
if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) {
throw (BeanCreationException)var18;
}
throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);
}
...........
}
二、spring bean中的两个重要接口
在四个过程中又Spring扩展中有两个很重要的接口,InstantiationAwareBeanPostProcessor和BeanPostProcessor。这两个接口实际是继承关系,但由于这两个接口在spring bean生命周期中的不同阶段是 不同接口本身的方法起作用所以这里将两个接口分开来看。
InstantiationAwareBeanPostProcessor 与BeanPostProcessor 之间的关系
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
....
}
1、InstantiationAwareBeanPostProcessor 接口
(1)InstantiationAwareBeanPostProcessor 中的applyBeanPostProcessorsBeforeInstantiation 的接口
InstantiationAwareBeanPostProcessor调用地方依然在AbstractAutowireCapableBeanFactory 这类中 createBean方法
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
......
Object beanInstance;
try {
//InstantiationAwareBeanPostProcessor 中的postProcessBeforeInstantiation方法
beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
if (beanInstance != null) {
return beanInstance;
}
} catch (Throwable var10) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var10);
}
try {
//spring bean 1、实例化 、属性赋值、初始化 方法
beanInstance = this.doCreateBean(beanName, mbdToUse, args);
if (this.logger.isTraceEnabled()) {
this.logger.trace("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
} catch (ImplicitlyAppearedSingletonException | BeanCreationException var7) {
throw var7;
} catch (Throwable var8) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", var8);
}
}
InstantiationAwareBeanPostProcessor 中的resolveBeforeInstantiation
@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
if (!mbd.isSynthetic() && this.hasInst