回到代碼中,觀察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的方法調用下節繼續