emmm.....這次先不說springboot原理,先好好回顧一下以前的注解版spring原理,先把spring原理了解清晰了,再看springboot原理更容易。
要說起spring,最重要的就是創建ioc容器的全過程,也可以叫做生命周期。
所謂的ioc容器就是實現類;我們常看到的,有一個最頂層的BeanFactory接口,還有一個子接口ApplicationContext,其實現類都可說是ioc容器(稱呼很籠統),只是ApplicationContext功能更強大,而且可以通過配置文件來實現功能,所以我們用這個接口的實現類(比如我們測試時候ApplicationContext ctx = new ClassPathXmlApplicationContext("com/yf/context/beans.xml");)比較多;
其實,就我感覺,ioc容器的生命周期有一條主線:ioc容器創建(其實就是類實例化,但是還沒有屬性賦值等操作)-------->加載所有bean的定義信息-------->創建bean的實例--------->屬性賦值(調用bean的setxxx方法)---------->假如bean實現了xxxAware接口,就執行setXXX方法---------->執行初始化方法(相當於xml<bean init-method="初始化方法">)----------->ioc容器創建完成,執行一些邏輯代碼------------->Web應用關閉,ioc容器銷毀。
跟着這條主線,然后再執行很多的后置處理器(xxxPostProcessor)的方法(大多是xxxBeforexxx,xxxAfterxxx,postxxx方法),換句話來說,只要我們搞清楚了這些后置處理器什么時候添加到容器內?什么時候執行?有什么效果?那么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后置處理器,后面再補充一下。對此我只想說,我勒個去,太特么嚴謹了。。。。小的服了@_@!
然后繼續運行就到第六步了,第六步下一節再一起看。
前面這五步也是粗略的看了看源碼,有個印象,很多的細節我都略過去了(偷個懶),不然,還能再寫很多。。。。。
