手拆框架之Spring IOC 跟蹤篇①

上節咱們講了基礎環境準備,從這節開始咱們正式進入源碼拆解環節。信息量較大,請你們拿出記事原本記錄一下spring

若有疑問歡迎加QQ羣: 77174608 來討論。安全

廢話很少說,進入跟蹤環節。mvc

首先咱們看看 ClassPathXmlApplicationContext 類的幾個構造函數ide

發現它重載了這麼多構造。那麼咱們找到那個有用的。函數

通常來說參數最多的那個基本上就是的post

能夠看得出來,全部的構造函數最終都會走到它。this

這裏提到了子父容器,先暫時不去講。咱們會到後續的文章穿插。子父容器在spring中是一個比較重要的概念,好比咱們用的springmvc就是一個典型的子父容器應用。這裏再也不累述對象

那麼開始看他如何去解析配置文件的(具體的流程請你們自行跟一下,很簡單,這裏就不贅述。本文重點是整個流程)繼承

拿到路徑以後就會進入事件

if (refresh) {
   refresh();
}

這一段。這一段纔是整個容器的核心。咱們跟進去看看它究竟作了什麼

它調用了父類AbstractApplicationContext. refresh() 方法

俺這裏大概大了一些註釋。在後續的文章中咱們會對每個關鍵節點進行逐一講解。

@Override
public void refresh() throws BeansException, IllegalStateException {
   // 對象鎖,主要是爲了防止建立多個容器對象。 至於爲何,你們應該懂的
   synchronized (this.startupShutdownMonitor) {
      // 記錄開始時間, 校驗一些必要的變量是否都加載完成。。。
      prepareRefresh();

      // 前方高能。。。請你們繫好安全帶。準備發車
      // 建立BeanFactory對象。
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

      // 這裏去加載了一些對於spring來講系統級的參數。後續文章會進行講解
      prepareBeanFactory(beanFactory);

      try {
         // 後處理的一些操做, spring預留出來的方法。咱們能夠自行繼承而後去複寫這個方法。作一些初始化完成後的操做
         postProcessBeanFactory(beanFactory);

         // 這裏調用了一些處理器
         invokeBeanFactoryPostProcessors(beanFactory);

         // 註冊Bean的攔截器
         registerBeanPostProcessors(beanFactory);

         // 初始化消息源的一些東西。
         initMessageSource();

         // 初始化事件監聽器
         initApplicationEventMulticaster();

         // Spring預留出來初始化其餘容器一些Bean的動做
         onRefresh();

         // 註冊監聽器
         registerListeners();

         // 實例化非懶加載的一些bean
         finishBeanFactoryInitialization(beanFactory);

         // 發佈對應的事件
         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 {
         // 釋放一些東西。。
         resetCommonCaches();
      }
   }
}

至此,本章就此結束。從下個章節起會開始深刻講解Bean容器初始化的每個細節。 

相關文章
相關標籤/搜索