Spring IOC(四)總結升華篇


本系列目錄

Spring IOC(一)概覽

Spring IOC(二)容器初始化

Spring IOC(三)依賴注入

Spring IOC(四)總結升華

=============正文分割線==================

Spring 有很多特性,支撐這些特性的是優良的設計思想,IOC(DI)就是其中最典型的控制反轉思想,或者叫依賴注入。本系列文章追蹤了容器的初始化、以及獲取bean的過程。下面總結了幾個核心流程圖。

1.spring容器中Bean生命周期

2.IOC容器中核心接口

  Spring Ioc容器的核心是BeanFactoryBeanDefinition。分別對應對象工廠和依賴配置的概念。雖然我們通常使用的是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依賴注入剛好對應社會、人、依存關系。不知道這樣講,大家是否了然了。正所謂大道歸一......


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM