Spring IOC(一)概覽html
Spring IOC(二)容器初始化spring
=============正文分割線==================url
Spring 有不少特性,支撐這些特性的是優良的設計思想,IOC(DI)就是其中最典型的控制反轉思想,或者叫依賴注入。本系列文章追蹤了容器的初始化、以及獲取bean的過程。下面總結了幾個核心流程圖。spa
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就是對控制反轉模式中管理的對象依賴關係的數據抽象,也是容器實現控制反轉的核心數據結構,有了他們容器才能發揮做用。3d
無論經過何種渠道定義的bean,xml配置仍是註解,最終容器啓動時,都會調用AbstractAplicationContext的Refesh()方法,流程圖整理以下,可對應第一節中的Bean生命週期圖,先beanFactory初始化、後置處理器,再bean後處理器,實例化bean。xml
這裏的依賴注入就是獲取bean時依賴注入相關屬性(或者其餘bean)。主要是AbstractBeanFactory和AbstractAutoWireCapableBeanFactory.htm
主要分兩步:
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依賴注入恰好對應社會、人、依存關係。不知道這樣講,你們是否瞭然了。正所謂大道歸一......