applicationContext中bean的生命周期的理解

该图引自spring开发企业级实战一书
在这里插入图片描述

这里主要的流程是在createBean调用的doCreateBean方法中
1)第1步BeanFactory的后处理器是在refresh()方法靠前的位置 postProcessBeanFactory(beanFactory);处就先执行的,执行的是对整个beanFactory的后处理。
后续所有的操作都是在preInstantiateSingletons中对所有的bean依次执行getBean方法时执行的

2)第2步:createBean中调用了resolveBeforeInstantiation方法,其中是调用了InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法

3)第3步:实例化体现在createBean的doCreateBean方法,这里实例化了一个bean,并将其包装为beanWrapper对象(后续属性相关的操作都是对beanWrapper进行的)

4)populateBean中执行了其中的4-6的步骤

第4步:InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation

if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
continueWithPropertyPopulation = false;
break;
}
}
}
}

中间还执行了autowired相关的注入
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}

// Add property values based on autowire by type if applicable.
if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}

第5步:执行了InstantiationAwareBeanPostProcessorpostProcessPropertyValues()方法
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
if (pvs == null) {
return;
}
}
}

第6步:这里是设置属性值
applyPropertyValues(beanName, mbd, bw, pvs);

最终执行了
mpvs = (MutablePropertyValues) pvs;

bw.setPropertyValues(mpvs);

5)populateBean后的initializeBean方法实现了7~13步
// Initialize the bean instance.
Object exposedObject = bean;
try {
populateBean(beanName, mbd, instanceWrapper);
if (exposedObject != null) {
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
这里执行了initializeBean方法,

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction() {
@Override
public Object run() {
invokeAwareMethods(beanName, bean);
return null;
}
}, getAccessControlContext());
}
else {
//这里包含了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口的处理
invokeAwareMethods(beanName, bean);
}

Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
//这里处理了所有beanPostProcess的postProcessBeforeInitialization方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}

try {
//这里处理了InitializingBean接口的afterPropertiesSet方法以及xml中的initMethod
invokeInitMethods(beanName, wrappedBean, mbd);
}

if (mbd == null || !mbd.isSynthetic()) {
//这里处理了beanPostProcessors的beanPostProcessorAfterInitializing方法
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}

理解这个需要懂如下的接口
BeanFactoryBeanPostProcessor:对于beanFactory执行的
InstantationAwareBeanPostProcess (实例化前后的3个方法)
前面两个实际上是全局适用的

Aware: BeanNameAware、ClassLoaderAware和ApplicationContextAware三个aware
BeanPostProcess (主要是beforeInitialing和afterInitialing),这里的beforeInitialing也是在属性设置后执行的,可以理解为是在InitializingBean接口的afterPropertiesSet前执行
这2个是对应的具体的bean上的

猜你喜欢

转载自blog.csdn.net/xiaohesdu/article/details/86155446