帶著萌新看springboot原始碼8(spring ioc原始碼上)
emmm.....這次先不說springboot原理,先好好回顧一下以前的註解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易。
要說起spring,最重要的就是建立ioc容器的全過程,也可以叫做生命週期。
其實,就我感覺,ioc容器的生命週期有一條主線:ioc容器建立(其實就是類例項化,但是還沒有屬性賦值等操作)-------->載入所有bean的定義資訊-------->建立bean的例項--------->屬性賦值(呼叫bean的setxxx方法)---------->假如bean實現了xxxAware介面,就執行setXXX方法---------->執行初始化方法(相當於xml<bean init-method="初始化方法">)----------->ioc容器建立完成,執行一些邏輯程式碼------------->Web應用關閉,ioc容器銷燬。
跟著這條主線,然後再執行很多的後置處理器(xxxPostProcessor)的方法(大多是xxxBeforexxx,xxxAfterxxx方法),換句話來說,只要我們搞清楚了這些後置處理器什麼時候新增到容器內?什麼時候執行?有什麼效果?那麼ioc容器的原理就差不多一目瞭然了。
提前準備(依賴,隨便一個類,配置類,測試方法):
點開這個類AnnotationConfigApplicationContext,載入新建ioc容器,載入配置檔案讀取資訊知道就可以了,來看看refresh方法
最好可以自己親自除錯一步一步的看過程,我這裡只會大概說一下。
下面就來簡要說說這12個流程
1.重新整理前的準備工作(prepareRefresh)
2.獲取容器( obtainFreshBeanFactory() )
點開this.beanFactory就到了如下這個類
然後就是將這個新建立的容器返回,並列印日誌到控制檯就ok了,沒啥好說的
3.對BeanFactory進行預準備工作(prepareBeanFactory)
4.對BeanFactory準備完成後做一些進一步處理的工作
點開這個方法,你會發現這是一個空方法,留給你自己實現的。你可以繼承本類或者子類,然後在容器建立完成並且準備工作做完之後,把BeanFactory返回給你,看你還需不需要再自定義一些其他的什麼鬼。
5.執行BeanFactory的後置處理器(invokeBeanFactoryPostProcessors(beanFactory) )
下面注意後置處理器的兩個介面:BeanFactoryPostProcessor介面和它的子介面BeanDefinitionRegistryPostProcessor,先執行實現了後面的這個介面的所有後置處理器,在執行所有實現了前面的這個介面的後置處理器。
後面就是拿到容器BeanFactory裡面的所有BeanDefinitionRegistryPostProcessor,按照這三種:實現PriorityOrdered介面,實現Ordered介面,沒實現介面;分別進行分類,新增到中間容器(currentRegistryProcessors),然後分別排序,新增到registryProcessors的容器裡面(這三種後置處理器最終都是放到這裡),分別遍歷中間容器,執行。(由於過程重複,就以實現PriorityOrdered介面的為例)
現在再執行所有實現了BeanFactoryPostProcessor這個介面的後置處理器(裡面肯定是遍歷,然後分別執行)
假如BeanFactory不是BeanDefinitionRegistry介面的實現類,不用什麼排序啊什麼的,就直接執行所有的後置處理器
然後,後面的程式碼和這上面差不多,也是拿到所有的BeanFactory的後置處理器,然後各種分類,但是我還是想不通不是應該都執行完了所有的BeanFactory的後置處理器了嗎?emmmmm,.....水平有限,網上找了找,還真的找到了。
原話是:”以上邏輯執行了所有引數傳入的和以bean定義方式存在的BeanDefinitionRegistryPostProcessor,也執行了所有引數傳入的BeanFactoryPostProcessor, 但是尚未處理所有以bean定義方式存在的 BeanFactoryPostProcessor, 下面的邏輯處理這部分 BeanFactoryPostProcessor.“
看來是上面這種處理還有些遺漏了BeanFactory後置處理器,後面再補充一下。對此我只想說,我勒個去,太特麼嚴謹了。。。。小的服了@_@!
然後繼續執行就到第六步了,第六步下一節再一起看。
前面這五步也是粗略的看了看原始碼,有個印象,很多的細節我都略過去了(偷個懶),不然,還能再寫很多。。。。。