Spring IOC實現原理解析

有人說,Spring Boot的出現,讓Java迎來了又一春,它是Java應用開發的顛覆者,徹底改變了Java應用開發的模式。

IOC

IOC即DI,控制反轉與依賴注入。表示的概念都是將對象自身從其依賴關係的管理中解放出來,將這個管理工作的責任交給第三方來完成。在Spring中,這個第三方就是IOC容器:基礎版的BeanFactory和升級版的ApplicationContext。IOC容器全面接手了對象依賴關係圖的管理工作。

管理工作主要分為兩大部分:元數據信息的準備和對象關係圖的正式建立。

元數據信息

元數據信息主要是指BeanDefinition,BeanDefinition是對Bean定義的描述數據結構,是IOC容器的關鍵數據結構。元數據信息的準備過程主要有三步:

  1. 定位:Resource資源定位(文件、路徑、網絡等,是BeanDefinition的資源定位)讀取與轉化:通過各類Reader和Parser將Resource解析為BeanDefinition數據結構註冊:將BeanDefinition註冊到IOC容器中的HashMap中去

對象依賴關係圖的建立

關係圖的建立大體有三步:

  1. 實例化Bean注入設置Bean的屬性Bean的初始化

IOC容器持有了BeanDefinition後,就可以根據BeanDefinition中的信息在實例化Bean時逐步建立起該Bean的依賴關係圖了。這一步與JVM中的類加載中解析階段有些神似,將BeanDefinition中的“符號引用”解析為實例引用。

建立工作通過getBean()方法觸發,會首先實例化該Bean(createBean()方法),然後會對該Bean的屬性進行設置(populateBean()方法),此時會向IOC容器再次getBean以獲取屬性值,依次類推,遞歸調用,最終建立對象依賴關係圖。同時對於對象間的depends-on依賴(順序依賴,如A依賴B的數據,但是B卻由C進行設置,此時A depends-on C)也進行遞歸的準備。在這個過程中Bean的實例化與依賴關係圖的建立是交替擴散式進行的。在Bean的屬性均注入完畢以後,調用Bean的初始化方法對Bean進行初始化(initializeBean()方法)。

在IOC中,Bean的實例化有兩種方式:一種是通過反射的構造函數實例化;一種是通過CGLIB實例化Proxy。通過CGLIB實例化的通常是設置了BeanPostProcessor,或者有lookup method/replace method,需要通過代理技術來實現。

對於Bean屬性的注入是通過反射技術來實現的。

Bean生命週期

Spring IOC容器在對Bean的生命週期進行管理時提供了Bean生命週期各個時間點的回調。

Bean的生命週期:

  1. Bean實例的創建(getBean->createBean)為Bean實例設置屬性(populateBean)初始化Bean(initializeBean)Bean 被應用使用容器關閉時,Bean銷燬(destoryMethod)

其中Bean的初始化主要依次做了4件事:

設定Bean對容器的感知(一系列Aware接口)

BeanPostProcessorsBeforeInitialization()方法

如果Bean實現了InitializingBean接口,調用afterPropertiesSet方法,如果指定了init-method,調用init-method

BeanPostProcessorsAfterInitialization()方法

Spring IOC實現原理解析


分享到:


相關文章: