回到代码中,观察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的方法调用下节继续