1. 程式人生 > >【Spring原始碼閱讀】IOC核心容器基礎和繼承體系結構

【Spring原始碼閱讀】IOC核心容器基礎和繼承體系結構

BeanFactory

BeanFacotry作為Spring的根容器物件,提供了對Bean的基礎操作功能,包括例項化、配置、管理Bean等。

ApplicationContext

ApplicationContext對BeanFactory進行了進一步地封裝,內建了BeanFacotry例項,不僅具備BeanFactory提供的所有功能,還提供了更豐富的配置管理BeanFacotry生命週期的能力。除此之外,ApplicationContext還額外提供了Spring事件管理機制,國際化/本地資源訪問等能力

總體類圖如下所示:

image
從ClassPathXmlApplicationContext實現類分析繼承關係,來梳理相關類和介面功能,具體如下:

  1. ClassPathXmlApplicationContext:基於類路徑下xml檔案配置的Spring容器上下文。定義了根據資源路徑建立Spring容器的相關建構函式入口。
  2. AbstractXmlApplicationContext:基於xml配置的針對ApplicationContext的基礎實現類,封裝了初始化XmlBeanDefinitionReader來載入BeanDefinitions的邏輯
  3. AbstractRefreshableConfigApplicationContext:封裝了根據路徑處理xml檔案的邏輯,主要用來供子類如FileSystemXmlApplicationContext,ClassPathXmlApplicationContext等呼叫解析資源路徑
  4. AbstractRefreshableApplicationContext:ApplicationContext的基礎實現類封裝了建立、初始化、重新整理內建BeanFactory的相關功能邏輯,定義了loadBeanDefinitions抽象方法,供子類實現根據不同的方式載入BeanDefinitions,實現了createBeanFactoryrefreshBeanFactoryhasBeanFactorygetBeanFactorycloseBeanFactory等相關邏輯對BeanFactory的生命週期進行管理(具體建立、重新整理核心邏輯由夫類AbstractApplicationContext實現),提供了customizeBeanFactory函式對內建的beanFactory進行進一步的定製
  5. AbstractApplicationContext:ApplicationContext的基礎實現,提供了refresh方法實現建立BeanFacotry的核心邏輯,具體實現內容可參照refresh函式:
public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
		// 供子類拓展,新增建立前必需屬性,校驗如果必需屬性不存在則丟擲MissingRequiredPropertiesException已成
		prepareRefresh();

		// 呼叫子類實現方法獲取(建立或重新整理)BeanFacotry容器,對於ClassPathXmlApplicationContext,主要呼叫了AbstractRefreshableApplicationContext中實現的方法
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

		// 設定類載入器,spel解析器,屬性編輯解析器等,忽略特定介面的依賴註冊(在特定時刻相關Bean再完成注入),註冊一些系統Bean供依賴注入使用。
		prepareBeanFactory(beanFactory);

		try {
			// BeanFactory建立完的後置處理。當前為空實現,供子類拓展
			postProcessBeanFactory(beanFactory);

			// 呼叫BeanFacotry的相關後置處理器,如果實現了Order相關介面,會先進行排序。
			invokeBeanFactoryPostProcessors(beanFactory);

			// 註冊相關BeanPostProcessor,供Bean生成前後呼叫。
			registerBeanPostProcessors(beanFactory);

			// 初始化國際化資訊源
			initMessageSource();

			// 初始化Spring相關上下文時間廣播器
			initApplicationEventMulticaster();

			// 模版方法供子類實現,用於初始化一些特殊Bean配置等
			onRefresh();

			// 註冊實現了ApplicationListener介面的事件監聽器,用於後續廣播器廣播事件
			registerListeners();

			// BeanFactory初始化完成時呼叫,初始ConversionService Bean,凍結beanFactory配置,並開始建立BeanFactory中所有非懶載入的單例Bean
			finishBeanFactoryInitialization(beanFactory);

			// 初始化Lifecycle處理器,呼叫onRefresh方法,廣播ContextRefreshedEvent。
			finishRefresh();
		}

		catch (BeansException ex) {
			if (logger.isWarnEnabled()) {
				logger.warn("Exception encountered during context initialization - " +
						"cancelling refresh attempt: " + ex);
			}

			// Destroy already created singletons to avoid dangling resources.
			destroyBeans();

			// Reset 'active' flag.
			cancelRefresh(ex);

			// Propagate exception to caller.
			throw ex;
		}
	}
}
  1. BeanNameAware: 定義了setBeanName方法,在初始化spring容器的實現了該介面的Bean時會呼叫本方法,設定BeanName屬性
  2. InitializingBean:定義了afterPropertiesSet方法,在spring容器建立實現了該介面的Bean並完成相關依賴注入後呼叫
  3. Aware:標誌Spring容器在實現了本介面的Bean進行建立後要注入相關的依賴屬性
  4. DisposableBean:定義了destroy方法,在spring容器銷燬單例的時候會觸發呼叫
  5. DefaultResourceLoader:ResourceLoader的基礎實現,定義了設定、獲取ClassLoader,通過路徑字串獲取Resource資源物件的方法
    1. Resource類:繼承自InputStreamSource介面,描述了資源相關操作方法,如判斷是否存在、可讀,獲取File物件、URL、檔名、描述等相關資訊
    2. ResourceLoader介面:定義了獲取資源和類載入器的方法規範
  6. ConfigurableApplicationContext:定義了除ApplicationContext中的方法外,更多的用於配置AplicationContext方法規範,包括配置環境,重新整理、獲取容器,新增應用監聽器,BeanFactory後置處理器等相關方法
  7. ApplicationContext:應用上下文頂層中心介面,除本身的一些獲取應用上下文名的基礎方法,通過繼承EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
    MessageSource, ApplicationEventPublisher, ResourcePatternResolver等類界定了ApplicationContext的基礎功能。
  8. EnvironmentCapable:定義了getEnvironment方法獲取當前Environment環境屬性
    1. Environment介面:繼承自PropertyResolver,定義了getActiveProfiles,getDefaultProfiles獲取當前啟用的環境型別。
    2. PropertyResolver介面:定義了根據key和類獲取屬性、解析佔位符等基礎能力
  9. MessageSource:定義了獲取國際化資源的基礎能力
  10. ApplicationEventPublisher: 定義了釋出上下文時間的基礎能力
  11. ResourcePatternResolver: 策略介面,用於定義獲取不同型別資源(classpath,xml,url)的能力
  12. ListableBeanFactory:定義了根據各種條件(型別/名稱/註解型別)獲取Bean配置列表,如根據型別獲取相應的bean名稱,Class元類等
  13. BeanFactory:Spring容器頂層介面,定義了獲取Bean例項,判斷Bean型別,根據名字獲取Bean型別、別名等相關方法

具體實現方法參照下圖
image