Spring容器創建過程


  Spring容器的refresh()   創建刷新

 1  prepareRefresh() 刷新前的預處理

      1) initProPertySources() 初始化一些屬性設置; 子類定義個性化的屬性設置方法

      2) getEnvironment( ) .validateRequiredProperties() 檢驗屬性的合法性

      3)earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>(); 保存容器中的一些早期的事件

2 obtainFreshBeanFactory() 獲取BeanFactory

     1)refreshBeanFactory() 刷新(創建) BeanFactory

                創建了一個this.beanFactory =  new DefaultListableBeanFactory()

     2) getBeanFactory() 返回剛才GenericApplicationContext 創建的BeanFactory對象

     3) 將創建的BeanFactory(DefaultListableBeanFactory)返回

3 prepareBeanFactory(beanFactory); BeanFactory的預准備工作(BeanFactory進行一些設置) 

     1 設置BeanFactory 的類加載器、支持表達式解析器

     2 添加部分BeanPostProcessor[ApplicationContextAwareProcessor]

    3 設置忽略的自動裝配的接口 EnvironmentAware、 EmbeddedValueResolverAware

    4  注冊可以解析的自動裝配。 直接在任何組件中自動注入: BeanFactory、 ResourceLoader、ApplicationEventPublisher、ApplicationContext

    5 添加BeanPostProcessor【ApplicationListenerDetector功能的Processor】

    6 添加編譯時的AspectJ

    7 給BeanFactory中注冊有些能用的組件

            environment【ConfigurableEnvironmetn】

            systemProperties  【Map<String, Object>】

             systemEnvironment 【Map<String, Object>】]       

4 PostProcessoBeanFactory(BeanFactory) BeanFactory准備工作完成后進行的后置處理工作

  1) 子類通過重寫這個方法來在BeanFactory創建並又准備完成以后做進一步的設置

 

到此為止  BeanFactory創建及其預准備工作完成

 

 

7  initMessageSource()  初始化MessageSource組件(做國際化功能,消息綁定,消息解析)

    1) 獲取BeanFactory

    2) 看容器是否有id 為messageSource的 類型是MessageSource的組件

           如果有賦值給messageSource 如果沒有自己創建一個DelegatingMessageSource

                     MessageSource去除估計會配置文件中的某個key值,能按照區域信息獲取

     3) 把創建好的MessageSource注冊在容器中 以后獲取國際化配置文件的值的時候,自動注入MessageSource

8 initApplicationEventMulticaster() 初始化時間派發器

   1) 獲取BeanFactory

   2)  從BeanFactory中獲取applicationEventMulticaster的ApplicationEventMulticaster

   3) 如果上一步沒有配置,創建一個SimpleApplicationEventMulticaster

   4) 將創建的ApplicationEventMulticaster添加到BeanFactory中,以后其他組件直接注入

 

9  onRerresh() 留給容器(子類)

    1)子類重寫這個方法,在容器刷新的時候可以自定義邏輯

10   registerListeners() 給容器中將所有項目里面的ApplicationListener注冊進來了

    1)從容器中拿到所有ApplicationListener

    2) 將每個監聽器添加到時間派發器中

         getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName)

    3) 派發之前步驟產生的事件

11 finishBeanFactoryInitialization(beanFactory) 初始化所有剩下的單實例bean 

    1)獲取容器中的所有Bean 一次進行初始和創建對象

    2)獲取Bdan的定義信息; RootBedanDefinition

    3)Bean不是抽象的,是單實例的,懶加載的

            1) 判斷是否是FactoryBean  是否實現FactoryBean接口的bean

            2)不是工廠Bean  利用getBean(beanName) 創建對象

                   0) getBean(beanName)  IOC.getBean()

                   1)doGetBean(name, null, null ,false) 

 

                   2) 先獲取緩存中保存的單實例Bean。 如果能夠獲取到這個Bean之前被創建過(所有創建過的單實例Bean都會被緩存起來) 

                   3)緩存中獲取不到,開始Bean的創建對象流程

                   4)標記當前bean已經被創建

                   5) 獲取Bean的定義信息

                   6)  獲取當前Bean依賴的其他Bean,如果有按照getBean() 把依賴的Bean先創建出來
                   7) 啟動單實例Bean的創建流程

                            1) createBean(beanName, mbd , args)

                            2)  Object bean =resolveBeforeINstantiation(beanName, mbdToUse)

                       

 

 

簡單總結:

  1 Spring容器在啟動時候,賢惠保存素有注冊進來的Bean的定義信息

         xml   注解  給容器注冊bean定義信息

 2  spring容器會在何時時機創建這些bean

      用到這個bean 的時候; 利用getBean創建Bean;創建好以后保存在容器中

     統一創建剩下所有的bean的時候; finishBeanFactoryInitialization() 

 3 后置處理器

   1 每一個bean創建完成都會使用各種后置處理器進行處理,來增強bean的功能

           處理自動注入   aop功能等 以及支持異步調用的 任務調度的 增強功能注解都是有響應的后置處理器

4 時間驅動模型

   ApplicationListener 事件監聽

   ApplicationEventMulticaster 事件派發

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM