天天看點

Spring-- Ioc 容器Bean執行個體化的幾種場景

Bean執行個體化的幾種場景

1、BeanDefinitionRegistryPostProcessor執行個體化:标準BeanFactoryPostProcessor的擴充,BeanFactoryPostProcessor的作用是用來進一步定義注冊的BeanDefinition,IoC容器本質就是Bean管理,是以BeanFactoryPostProcessor本身也是Bean,要對BeanFactoryPostProcessor的BeanDefinition進一步定義就通過BeanDefinitionRegistryPostProcessor進行注冊,BeanDefinitionRegistryPostProcessor及其子類是Ioc容器最執行個體化的一類Bean。它們在ConfigurableApplicationContext(ApplicationContext子接口)實作類調用refresh()方法調用invokeBeanFactoryPostProcessors(beanFactory);方法時就被執行個體化。

2、BeanFactoryPostProcessor執行個體化:僅次于BeanDefinitionRegistryPostProcessor被執行個體化。它們在同一個方法進行執行個體化,隻是順序有先後。

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactorybeanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors)
           

3、BeanPostProcessorss執行個體化:BeanPostProcessors是Ioc容器Bean管理的擴充點,定義了Bean執行個體化前後的回調方法,那它執行個體化肯定是得比普通的Bean早。ConfigurableApplicationContext.registerBeanPostProcessors(beanFactory)方法負責對BeanPostProcessors進行執行個體化。實際上執行個體化BeanPostProcessor的類是PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory,this);

4、MessageSource類型Bean執行個體化:對應refresh()調用的initMessageSource();

5、ApplicationEventMulticaster(事件廣播)類型Bean執行個體化:負責ApplicationEvent事件廣播的bean,refresh()調用initApplicationEventMulticaster();進行執行個體化。這個Bean是不需要進行配置的,但它通用是在Ioc容器内,而且還是單例的。

6、AbstractApplicationContext類的子類可能會執行個體化個性化的Bean,refresh()調用onRefresh();方法做這個事情。

7、ApplicationListener類型Bean執行個體化:ApplicationEventMulticaster負責事件廣播,它得注冊廣播對象,所有ApplicationListener都會在registerListeners();執行個體化。

1~7對應的Bean都是一些特殊的Bean,除6是由子類決定,其他的都是按照類型進行執行個體化,執行個體化調用的方法是:BeanFactory的String[] getBeanNamesForType(Class<?> type, booleanincludeNonSingletons, boolean allowEagerInit);方法,并且這些Bean設定lazy-init是無效的,設定singleton也是無效的

8、非lazy-init且singleton的Bean執行個體化:調用inishBeanFactoryInitialization(beanFactory);

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
		// 有容器轉換服務bean時先執行個體化這種Bean
		if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
				beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
			beanFactory.setConversionService(
					beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
		}

		// 執行個體化LoadTimeWeaverAware類型Bean
		String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
		for (String weaverAwareName : weaverAwareNames) {
			getBean(weaverAwareName);
		}

		// 停止使用臨時類加載器
		beanFactory.setTempClassLoader(null);

		// 緩存容器中所有注冊的BeanDefinition中繼資料,以防被修改
		beanFactory.freezeConfiguration();

		// 執行個體化剩餘的所有非lazy-init singleton Bean
		beanFactory.preInstantiateSingletons();
	}
           

9、其他Bean執行個體化場景:a.上述1-8對應的Bean執行個體化依賴其他Bean時,那個Bean同時被執行個體化(這個在分析createBean()說明);b.延遲執行個體化的singleton Bean在第一次通過getBean()主動執行個體化它時執行個體化;c.prototype每次調用getBean()時都執行個體化;其他Scope的在它的生命周期内第一次通過getBean()主動執行個體化時執行個體化。