本系列目錄
=============正文分割線==================
Spring 有很多特性,支撐這些特性的是優良的設計思想,IOC(DI)就是其中最典型的控制反轉思想,或者叫依賴注入。本系列文章追蹤了容器的初始化、以及獲取bean的過程。下面總結了幾個核心流程圖。
1.spring容器中Bean生命周期
2.IOC容器中核心接口
Spring Ioc容器的核心是BeanFactory和BeanDefinition。分別對應對象工廠和依賴配置的概念。雖然我們通常使用的是ApplicationContext的實現類,但ApplicationContext只是封裝和擴展了BeanFactory的功能。XML的配置形式只是Spring依賴注入的一種常用形式而已,而AnnotationConfigApplicationContext配合Annotation注解和泛型,早已經提供了更簡易的配置方式,AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContext則是實現無XML配置的核心接口,但無論你使用任何配置,最后都會映射到BeanDefinition。
其次,這里特別要注意的還是BeanDefinition, Bean在XML文件里面的展現形式是<bean id="…">…</bean>,當這個節點被加載到內存中,就被抽象為BeanDefinition了,在XML Bean節點中的那些關鍵字,在BeanDefinition中都有相對應的成員變量。如何把一個XML節點轉換成BeanDefinition,這個工作自然是由BeanDefinitionReader來完成的。Spring通過定義BeanDefinition來管理基於Spring的應用中的各種對象以及它們之間的相互依賴關系。BeanDefinition抽象了我們對Bean的定義,是讓容器起作用的主要數據類型。我們知道在計算機世界里,所有的功能都是建立在通過數據對現實進行抽象的基礎上的。Ioc容器是用BeanDefinition來管理對象依賴關系的,對Ioc容器而言,BeanDefinition就是對控制反轉模式中管理的對象依賴關系的數據抽象,也是容器實現控制反轉的核心數據結構,有了他們容器才能發揮作用。
3.IOC容器啟動流程
不管通過何種渠道定義的bean,xml配置還是注解,最終容器啟動時,都會調用AbstractAplicationContext的Refesh()方法,流程圖整理如下,可對應第一節中的Bean生命周期圖,先beanFactory初始化、后置處理器,再bean后處理器,實例化bean。
4.IOC依賴注入流程
這里的依賴注入就是獲取bean時依賴注入相關屬性(或者其他bean)。主要是AbstractBeanFactory和AbstractAutoWireCapableBeanFactory.
主要分兩步:
1.bean實例化和初始化
2.根據實例化bean獲取bean對象。流程圖如下:
值得一提的是bean初始化方法:AbstractAutoWireCapableBeanFactory.initializeBean中封裝了
1.Aware接口方法:
BeanNameAware:setBeanName
ResourceLoaderAware:setBeanClassLoader
BeanFactoryAware:setBeanFactory
2.BeanPostProcessors: postProcessBeforeInitialization初始化前置處理器
3.InitializingBean:afterPropertiesSet
4.init-method自定義初始化方法
5.BeanPostProcessors :PostProcessorsAfterInitialization初始化后置處理器
這些接口方法全部在bean的生命周期中可以查到。
我們可以對比Bean生命周期圖、容器啟動流程圖、IOC依賴注入流程圖,可以發現這三個圖,相互印證,互相依存。
精髓思想:
如果說容器就是社會,是有秩序的。容器中的Bean就像社會中的人一樣,人生活在社會中,由社會創造人並維護人的生命周期。那么IOC依賴注入就是容器把Bean安插在各個需要的地方,就像是社會把人安排在需要的崗位上去實現自己的價值。
容器、Bean、IOC依賴注入剛好對應社會、人、依存關系。不知道這樣講,大家是否了然了。正所謂大道歸一......