1. 程式人生 > >帶著萌新看springboot原始碼8(spring ioc原始碼下)

帶著萌新看springboot原始碼8(spring ioc原始碼下)

  繼續接著上一節,到了第六步(溫馨提醒,內容有點小多,不過看完ioc原理就差不多了)

6.註冊Bean後置處理器(registerBeanPostProcessors(beanFactory))

  

 

  最後一步,新增一個後置處理器,開啟這個後置處理器

 

7.initMessageSource();(主要是做國際化功能,訊息繫結,emmm...不怎麼了解這個)

  大概的意思就是先判斷容器裡有沒有一個id=messageSource,型別為MessageSource的元件(用於解析國際化的配置檔案),有的話直接用(就是去拿國際化配置檔案的資訊),沒有的話就new 一個DelegatingMessageSource(),丟到容器裡面,然後再接著用.....反正我對這個不怎麼了解,有興趣的小夥伴可以自己去看看別的教程或者自己去走走原始碼。我就跳過了。

 

8.初始化事件派發器(initApplicationEventMulticaster();)

  最好和下面的註冊監聽器一起看,在我以前發過知識小罐頭的那個文章裡大概說了一下事件派發器的原理,就是事件派發器會自動的收集所有的監聽器,容器只需要釋出訊息,事件派發器就會將事件派發給所有監聽器,讓監聽器都去執行。

  下面來大概看看原始碼:

 

9.OnRefrsh

  這又是一個空方法,加入我們繼承本類(子容器),讓我們在容器重新整理的時候,可以自定義一些操作。

 

10.註冊監聽器(registerListeners();)

 

  至於怎麼獲取事件派發器,和怎麼派發事件,這個很容易,自己點進去看看就ok了(也可以自己實現一個監聽器,放到容器裡,然後除錯,可能看的更清楚點)

 

11.完成BeanFactory的初始化(finishBeanFactoryInitialization(beanFactory);)

  這裡是重點:有沒有前面都是為BeanFactory做的一些預設工作,往裡面新增一些什麼元件,監聽器,訊息派發器什麼的,一直到這裡,就是對其他的單例項Bean(是單例項,因為我們在往容器裡新增我們定義的bean的時候,可以設定多例或者懶載入,單例的話例項化一次,然後給你丟快取裡,多例和懶載入是要在每次用的時候才去給你例項化一個)

 

 

  

  然後再進去doGetBean(單例項的Bean,只要建立過就會快取起來)

 

   接著進入resolveBeforeInstantiation方法,下圖的兩個方法可以點進去自己看看(就是執行InstantiationAwareBeanPostProcessor裡面的方法),很有意思。其實用註解開啟事務跟這個有關。

  

  上面是如果能返回代理物件的,假如不能返回代理物件的話,

 

  進入doCreatBean方法,

 

  繼續進入createBeanInstance,

 

   例項建立完了,然後返回,再執行後置處理器的方法

 

  繼續往下走(這裡就是相當於核心了),兩步,賦值,初始化

 

 

  開啟populateBean方法(注意:先拿到所有的屬性值,然後執行了兩個後置處理器之後,再進行賦值

 

 

   一直到populateBean方法的最後,才賦值(其實就是呼叫一些setXXX方法)

 

 ---------------------------------------------------------------------------------------------------------------------

  賦值結束,下面進行初始化

 

  

  進入初始化Bean方法

  而且可以進去看看有哪些xxxAware介面

 

  繼續往下看,執行初始化方法前後,都要執行bean後置處理器(BeanPostProcessor)的xxxBeforexxx,xxxAfterxxx的方法

   下面我們還可以看看要執行哪些後置處理器

  

  ok,初始化方法前後的操作都知道了,現在看看初始化方法內部了(還記不記得怎麼設定初始化方法啊第一種:實現InitializingBean介面和DisposableBean介面;第二種:@Bean(initMethod=“初始化方法名” destroyMethod=“銷燬方法名”;其他的的方法記不清了,嘿嘿...))

  

  到這裡單例項Bean就創建出來了,返回出去

 

  繼續往下走,註冊實現了Disposable介面的bean

 

  到這裡,單例項Bean就建立完了,然後就把這建立完的單例項bean放到快取裡去(其實我看了,就是一個map)

 

  

  到這裡,這一節就結束了,ioc說的差不多了,還有一小步,下一節收尾就ok了。

  而且,能看到最後的小夥伴,有沒有發現,其實ioc容器本質上就是很多的map,map裡面放了很多的元件,我們要用這些元件就是從這麼多map裡面去拿,所以不要把ioc容器想的太難了(咳咳,雖然我也很菜,ioc對新人確實有點難),多走走原始碼,其實還是挺有感覺的。哈哈哈@[email protected]