Spring是一個非常活躍的開源架構;它是一個基于Core來架構多層JavaEE系統的架構,它的主要目的是簡化企業開發。Spring以一種非侵入式的方式來管理你的代碼,Spring提倡“最少侵入,這也意味着你可以适當的時候安裝或解除安裝Spring。
1、BeanFactory
2、ApplicationContext
3、Bean建立過程
4、容器擴充
5、感覺接口 *Aware
6、廣播與監聽
7、資源
8、運作環境抽象
BeanFactory類圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iNjFjN5U2MlVzNkV2YmBDMiRDM0QDM4QmY5QDMlRGOw8CX5EzLcJDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL1M3Lc9CX6MHc0RHaiojIsJye.png)
- BeanFactory - SpringIoC容器頂級接口,定義了對單個bean的擷取,對bean的作用域判斷,擷取bean類型,擷取bean别名的功能
AbstractApplicationContext .refresh() 源碼脈絡
- ApplicationContext - 繼承于BeanFactory,包括了BeanFactory的所有功能
AbstractApplicationContext .refresh() 方法
@Overridepublic void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. 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; }finally { // Reset common introspection caches in Spring's core, since we // might not ever need metadata for singleton beans anymore... resetCommonCaches(); } }}
-
prepareRefresh()
為重新整理準備上下文,主要設定狀态量(是否關閉,是否激活),記錄啟動時間,初始化屬性資源占位符、校驗必填屬性是否配置及初始化用于存儲早期應用事件的容器
- obtainFreshBeanFactory()
主要用于擷取一個新的BeanFactory,如果BeanFactory已存在,則将其銷毀并重建,預設重建的BeanFactory為AbstractRefreshableApplicationContext;此外此方法委托其子類從XML中或基于注解的類中加載BeanDefinition
- prepareBeanFactory()
配置BeanFactory使其具有一個上下文的标準特征,如上下文的類加載器、後處理程式(post-processors,如設定如總感覺接口)
- postprocessBeanFactory()
在應用上下文内部的BeanFactory初始化結束後對其進行修改,在所有的BeanDefinition已被加載但還沒有執行個體化bean, 此刻可以注冊一些特殊的BeanPostFactory,如web應用會注冊ServletContextAwareProcessor等
- invokeBeanFactoryPostProcessors()
調用注冊在上下文中的BeanFactoryPostProcessor,如果有順序則按順序調用,并且一定再單列對象執行個體化之前調用
- registerBeanPostProcessors()
執行個體化并注冊BeanPostProcessor,如果有顯式的順序則按照順序調用一定在所有bean執行個體化之前調用
- initMessageSource()
初始化MessageSource,如果目前上下文沒有定義則使用其父類的,如果BeanFactory中不能找到名稱為messageSource中的bean, 則預設使用DelegatingMessageSource
- initApplicationEventMulticaster()
初始化ApplicationEventMulticaster,如果上下文沒有定義則預設使用SimpleApplicationEventMulticaster,此類主要用于廣播ApplicationEvent
- onRefresh()
在一些特定的上下文子類中初始化特定的bean,如在Webapp的上下文中初始化主題資源
- registerListeners()
添加實作了ApplicationListener的bean作為監聽器,它不影響非bean的監聽器;還會使用多點傳播器釋出早期的ApplicationEvent
- finishBeanFactoryInitialization()
執行個體化所有非延遲加載的單例,完成BeanFactory的初始化工作
- finishRefresh()
完成上下文的重新整理工作,調用LifecycleProcessor的onFresh()及釋出的ContextRefreshEvent事件
- resetCommonCaches()