《spring設計思想》14-initializeBean,bean的初始化做了啥

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章