繼續接着上一節,到了第六步(舒適提醒,內容有點小多,不過看完ioc原理就差很少了)緩存
6.註冊Bean後置處理器(registerBeanPostProcessors(beanFactory))spa
最後一步,添加一個後置處理器,打開這個後置處理器3d
7.initMessageSource();(主要是作國際化功能,消息綁定,emmm...不怎麼了解這個)代理
大概的意思就是先判斷容器裏有沒有一個id=messageSource,類型爲MessageSource的組件(用於解析國際化的配置文件),有的話直接用(就是去拿國際化配置文件的信息),沒有的話就new 一個DelegatingMessageSource(),丟到容器裏面,而後再接着用.....反正我對這個不怎麼了解,有興趣的小夥伴能夠本身去看看別的教程或者本身去走走源碼。我就跳過了。調試
8.初始化事件派發器(initApplicationEventMulticaster();)對象
最好和下面的註冊監聽器一塊兒看,在我之前發過知識小罐頭的那個文章裏大概說了一下事件派發器的原理,就是事件派發器會自動的收集全部的監聽器,容器只須要發佈消息,事件派發器就會將事件派發給全部監聽器,讓監聽器都去執行。blog
下面來大概看看源碼:繼承
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對新人確實有點難),多走走源碼,其實仍是挺有感受的。哈哈哈@_@