【Spring原始碼閱讀】IOC核心容器基礎和繼承體系結構
阿新 • • 發佈:2018-12-27
BeanFactory
BeanFacotry作為Spring的根容器物件,提供了對Bean的基礎操作功能,包括例項化、配置、管理Bean等。
ApplicationContext
ApplicationContext對BeanFactory進行了進一步地封裝,內建了BeanFacotry例項,不僅具備BeanFactory提供的所有功能,還提供了更豐富的配置管理BeanFacotry生命週期的能力。除此之外,ApplicationContext還額外提供了Spring事件管理機制,國際化/本地資源訪問等能力
總體類圖如下所示:
從ClassPathXmlApplicationContext實現類分析繼承關係,來梳理相關類和介面功能,具體如下:
- ClassPathXmlApplicationContext:基於類路徑下xml檔案配置的Spring容器上下文。定義了根據資源路徑建立Spring容器的相關建構函式入口。
- AbstractXmlApplicationContext:基於xml配置的針對ApplicationContext的基礎實現類,封裝了初始化XmlBeanDefinitionReader來載入BeanDefinitions的邏輯
- AbstractRefreshableConfigApplicationContext:封裝了根據路徑處理xml檔案的邏輯,主要用來供子類如FileSystemXmlApplicationContext,ClassPathXmlApplicationContext等呼叫解析資源路徑
- AbstractRefreshableApplicationContext:ApplicationContext的基礎實現類封裝了建立、初始化、重新整理內建BeanFactory的相關功能邏輯,定義了
loadBeanDefinitions
抽象方法,供子類實現根據不同的方式載入BeanDefinitions,實現了createBeanFactory
,refreshBeanFactory
,hasBeanFactory
,getBeanFactory
,closeBeanFactory
等相關邏輯對BeanFactory的生命週期進行管理(具體建立、重新整理核心邏輯由夫類AbstractApplicationContext實現),提供了customizeBeanFactory函式對內建的beanFactory進行進一步的定製 - 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;
}
}
}
- BeanNameAware: 定義了
setBeanName
方法,在初始化spring容器的實現了該介面的Bean時會呼叫本方法,設定BeanName屬性 - InitializingBean:定義了
afterPropertiesSet
方法,在spring容器建立實現了該介面的Bean並完成相關依賴注入後呼叫 - Aware:標誌Spring容器在實現了本介面的Bean進行建立後要注入相關的依賴屬性
- DisposableBean:定義了
destroy
方法,在spring容器銷燬單例的時候會觸發呼叫 - DefaultResourceLoader:ResourceLoader的基礎實現,定義了設定、獲取ClassLoader,通過路徑字串獲取Resource資源物件的方法
- Resource類:繼承自InputStreamSource介面,描述了資源相關操作方法,如判斷是否存在、可讀,獲取File物件、URL、檔名、描述等相關資訊
- ResourceLoader介面:定義了獲取資源和類載入器的方法規範
- ConfigurableApplicationContext:定義了除ApplicationContext中的方法外,更多的用於配置AplicationContext方法規範,包括配置環境,重新整理、獲取容器,新增應用監聽器,BeanFactory後置處理器等相關方法
- ApplicationContext:應用上下文頂層中心介面,除本身的一些獲取應用上下文名的基礎方法,通過繼承EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver等類界定了ApplicationContext的基礎功能。 - EnvironmentCapable:定義了
getEnvironment
方法獲取當前Environment環境屬性- Environment介面:繼承自PropertyResolver,定義了
getActiveProfiles
,getDefaultProfiles
獲取當前啟用的環境型別。 - PropertyResolver介面:定義了根據key和類獲取屬性、解析佔位符等基礎能力
- Environment介面:繼承自PropertyResolver,定義了
- MessageSource:定義了獲取國際化資源的基礎能力
- ApplicationEventPublisher: 定義了釋出上下文時間的基礎能力
- ResourcePatternResolver: 策略介面,用於定義獲取不同型別資源(classpath,xml,url)的能力
- ListableBeanFactory:定義了根據各種條件(型別/名稱/註解型別)獲取Bean配置列表,如根據型別獲取相應的bean名稱,Class元類等
- BeanFactory:Spring容器頂層介面,定義了獲取Bean例項,判斷Bean型別,根據名字獲取Bean型別、別名等相關方法
具體實現方法參照下圖