帶着萌新看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對新人確實有點難),多走走源碼,其實還是挺有感覺的。哈哈哈@_@

  


免責聲明!

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



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