回到代码中,观察initializeBean方法
/**
* Initialize the given bean instance, applying factory callbacks
* as well as init methods and bean post processors.
* <p>Called from {@link #createBean} for traditionally defined beans,
* and from {@link #initializeBean} for existing bean instances.
*/
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
//调用invokeAwareMethods方法,回调bean实现的aware方法
invokeAwareMethods(beanName, bean);
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// 回调BeanPostProcessor的postProcessBeforeInitialization方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
// 调用 bean的 initializingBean的接口方法:afterPropertiesSet:调用自定义的initMethod。
invokeInitMethods(beanName, wrappedBean, mbd);
}
...
// 调用 BeanPostProcessor的 postProcessorAfterInitialization方法
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
方法很简单,思路很清晰:
1-调用 invokeAwareMethods方法,回调bean实现的各种aware接口
2-调用applyBeanPostProcessorsBeforeInitialization,回调beanFactory/applicationContext中已经注入的beanPostProcessor的postProcessBeforeInitialization方法
3-调用invokeInitMethods方法,调用bean实现的InitializingBean的afterPropertiesSet方法。调用xml中自定义的 init方法。
4-调用applyBeanPostProcessorsAfterInitialization,回调beanFactory/applicationContext中已经注入的beanPostProcessor的postProcessAfterInitialization.
首先是调用bean实现的aware接口。代码如下:
先调用BeanNameAware接口,再调用BeanClassLoaderAware接口,最后调用BeanFactoryAware接口。三个方法简单。
BeanPostProcessor的方法调用下节继续