IOC的全稱是Inversion of Control,能夠理解爲控制反轉,控制的是bean,反轉的是bean的生命週期由使用者變爲Spring框架。IOC是Spring的核心,使用者無需再手動建立對象,Spring定義出Bean容器的概念,負責管理對象的生命週期,下面結合代碼對IOC核心流程進行分析。html
Bean容器初始化流程,包括bean配置的解析,bean生命週期管理,也是IOC開始的地方。核心流程在AbstractApplicationContext.refresh(),refresh能夠理解爲刷新,包含兩部分,1. 若是有已經存在的那麼先銷燬;2. 建立新的。下面對refresh的代碼函數進行分析。java
1.prepareRefresh()web
準備,這個方法主要完成一些準備工做,包括容器的狀態初始化,環境配置校驗spring
2.obtainFreshBeanFactory()session
通知子類完成刷新,主要實現是類AbstractRefreshableApplication,其中核心邏輯是判斷當前是否已經有beanFactory,若是有那麼先銷燬,而且釋放全部的bean,而後再建立出一個新的beanFactoryapp
3.prepareBeanFactory()框架
準備beanFactory,主要工做是將相關實體set到beanFactory,好比classLoader,beanPostProcessor等,beanPostProcessor是spring留出的一個hook,可讓使用者在bean實例化的過程當中作定製化,詳細能夠看`BeanPostProcessor`,提供了實例化bean以前和以後的回調方法。函數
4.postProcessBeanFactory()post
留出給子類修改beanFactory的入口,注意這不是BeanFactory,常見的有GenericWebApplicationContext,會爲web環境增長額外bean的scope,咱們知道容器原生支持bean的scope是singleton和prototype,顯然這對web應用來講是不知足的,因此針對web應用,增長了request,session和global_session,3種類型的bean scope。prototype
5.invokeBeanFactoryPostProcessors()
核心流程參考`PostProcessorRegistrationDelegate`,主要功能是觸發全部` BeanFactoryPostProcessor.postProcessBeanFactory()`
6.registerBeanPostProcessor()
註冊攔截Bean建立的Bean處理器,即註冊BeanPostProcessor,不是BeanFactoryPostProcessor,注意二者的區別,這裏僅僅是註冊,並不會執行對應的方法,將在bean的實例化時執行對應的方法
7.initMessageSource()
詳細做用參考類MessageSource
8.initApplicationEventMulticaster()
初始化事件廣播器,Spring提供了事件-監聽機制,用於管理對不一樣事件發生時的處理流程,常見的事件好比容器啓動事件,結束事件等。而廣播器用來控制和維護監聽以及事件。
9.onfresh()
預留給子類擴展
10.registerListeners()
在全部bean中查找listener bean,而後註冊到廣播器中,spring提供了事件-監聽機制,使用者能夠註冊本身的監聽器到spring中。
11.finishBeanFactoryInitialization()
對那些是scope是singleton,且不是抽象類,而且不作懶加載的bean進行初始化,也就是預加載,從而加快該bean首次被調用的響應時間,不然到使用中調用getBean()的時候bean纔會被正真的實例化。singleton表示單例,能夠進行預加載,protptype做用域就不行。
12.finishRefresh()
初始化生命週期處理器DefaultLifecycleProcessor,DefaultLifecycleProcessor含有start方法和stop方法,spring啓動的時候調用start方法開始生命週期, spring關閉的時候調用stop方法來結束生命週期,一般用來配置後臺程序,啓動有一直運行,如一直輪詢kafka啓動全部實現了Lifecycle接口的類經過spring的事件發佈機制發佈ContextRefreshedEvent事件,以保證對應的監聽器作進一步的處理,即對那種在spring啓動後須要處理的一些類,這些類實現了ApplicationListener<ContextRefreshedEvent> ,這裏就是要觸發這些類的執行(執行onApplicationEvent方法)另外,spring的內置Event有ContextClosedEvent、ContextRefreshedEvent、ContextStartedEvent、ContextStoppedEvent、RequestHandleEvent完成初始化,通知生命週期處理器lifeCycleProcessor刷新過程,同時發出ContextRefreshEvent通知其餘監聽。
1.如何實例化bean
Spring對bean進行實例化,一樣也提供了兩種基礎的方案,基於java和基於cglib,默認採用cglib方案 `CglibSubclassingInstantiationStrategy`,經過對Enhancer的使用,基於動態代理生成一個新的類,再經過對構造函數的反射實例化對象。
2.如何注入bean的屬性
參考類AbstractAutoWireCapableBeanFactory.populateBean(),其中核心思路是基於name或者基於type的注入,若是衝突能夠根據配置選擇是否覆蓋。實際注入的操做在`InjectionMetadata`,目前支持兩種注入,1. 基於Field的注入,也就是經過java反射將實際的對象賦值給字段;2. 方法觸發,經過java反射調用方法。固然spring在實際注入以前,還有不少細節操做,好比類型轉換,參考接口`TypeConverter`。
Spring依賴注入的核心思路是圍繞着Bean展開的,首先是Bean的聲明解析,包括基於XML,基於註解,而後是Bean如何實例化和注入,直接相關的有BeanFactory,也就是管理Bean整個生命週期的容器,還有由BeanFactory引伸出的BeanFactoryPostProcessor,用於對BeanFactory個性化處理,一樣對Bean實例化過程當中也有個性化的方案BeanPostProcessor。以及對Bean以及相關依賴進行封裝的BeanWrapper。另外對Bean的生命週期管理必然會有不少事件,引伸出了監聽-事件機制。從邏輯角度來理解Bean的生命週期,能更好的理解IOC的本質。
// 很是詳細的代碼分析