上節咱們講了基礎環境準備,從這節開始咱們正式進入源碼拆解環節。信息量較大,請你們拿出記事原本記錄一下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容器初始化的每個細節。