天天看點

Spring 源碼脈絡IOC/DI -BeanFactory、ApplicationContext

 Spring是一個非常活躍的開源架構;它是一個基于Core來架構多層JavaEE系統的架構,它的主要目的是簡化企業開發。Spring以一種非侵入式的方式來管理你的代碼,Spring提倡“最少侵入,這也意味着你可以适當的時候安裝或解除安裝Spring。

1、BeanFactory

2、ApplicationContext

3、Bean建立過程 

4、容器擴充

5、感覺接口 *Aware

6、廣播與監聽

7、資源

8、運作環境抽象

BeanFactory類圖

Spring 源碼脈絡IOC/DI -BeanFactory、ApplicationContext
BeanFactory 源碼脈絡

  • 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()