1:IOC
IOC作為Spring容器的核心智绸。成功完成了對(duì)象依賴關(guān)系的管理權(quán)的反轉(zhuǎn)窝稿。
在起初的開發(fā)過程中:許多應(yīng)用都是多個(gè)類通過彼此的合作來實(shí)現(xiàn)業(yè)務(wù)邏輯的楣富,這使得每個(gè)對(duì)象都需要與其合作的對(duì)象的引用,如果這個(gè)獲取過程由對(duì)象自己來完成伴榔,那么將導(dǎo)致代碼的高度耦合和難以測(cè)試纹蝴。
依賴反轉(zhuǎn)是依賴對(duì)象的獲取被反轉(zhuǎn)。這種對(duì)象之間的依賴關(guān)系注入交給了框架和IOC容器來管理踪少。
Spring通過定義了BeanDefinition這種核心的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)依賴反轉(zhuǎn)功能的塘安。
BeanDefinition是用來管理基于Spring的應(yīng)用中的各種對(duì)象以及他們之間的相互關(guān)系。
1.1 IOC容器初始化過程
ioc容器的初始化是由refresh()方法的啟動(dòng)來開始的援奢。整個(gè)工程主要分為三大步兼犯。
1:加載配置文件。其實(shí)就是Resource的定位過程集漾。
這一步主要是由ResourceLoader通過Resource接口來完成的切黔。就是去尋找各種相關(guān)的配置文件。
2:BeanDefinition的載入
以XML為例子具篇。找到xml配置文件后纬霞,調(diào)用對(duì)應(yīng)的解析器,讀取配置文件驱显。生成BeanDefinition诗芜。
整個(gè)BeanDefinition其實(shí)就是Bean對(duì)象在IOC容器里面的一種抽象侨舆,<bean></bean>為一個(gè)BeanDefinition。
這個(gè)BeanDefinition的載入又可以分為2步
a:通過調(diào)用對(duì)應(yīng)的XML解析器解析成為document對(duì)象
b:調(diào)用Spring的Bean規(guī)則進(jìn)行解析
例如:init-method绢陌,class factory-method,scope等屬性等等解析成為了一個(gè)BeanDefinition數(shù)據(jù)類型熔恢。整個(gè)過程可以看成是一個(gè)反射獲取數(shù)據(jù)的過程脐湾。
3:將解析生成好的BeanDefinition注冊(cè)到IOC容器上。
這個(gè)過程最為重要叙淌,這個(gè)過程是通過調(diào)用BeanDefinitionRegistry接口來實(shí)現(xiàn)的秤掌。通過分析,在IOC容器內(nèi)部將BeanDefinition注入到了一個(gè)hashMap中鹰霍,IOC容器就是通過整個(gè)HashMap來持有這些BeanDefinition數(shù)據(jù)的闻鉴。
DefaultListableBeanFactory
private final MapbeanDefinitionMap = new ConcurrentHashMap(256);
把Bean的名字。beanName作為一個(gè)key茂洒,BeanDefinition作為一個(gè)value放到整個(gè)IOC容器所持有的Map中孟岛。
需要注意的是,現(xiàn)在還是在IOC容器初始化的階段督勺。還沒有包含Bean依賴注入的實(shí)現(xiàn)渠羞,在Spring的設(shè)計(jì)中,Bean定義的載入和依賴注入是兩個(gè)獨(dú)立的過程智哀。依賴注入一般是應(yīng)用在第一次通過·getBean向容器索取Bean的時(shí)候次询。也有一個(gè)例外。就是可以配置lazy-init屬性來完成對(duì)Bean的實(shí)例化瓷叫。
1.2 IOC容器的依賴注入
依賴注入的起點(diǎn)就是getBean方法屯吊。之后會(huì)調(diào)用createBean方法。這個(gè)createBean不僅是根據(jù)整個(gè)BeanDefinition定義的要求來生成摹菠,同時(shí)還對(duì)Bean的初始化進(jìn)行了處理盒卸。整個(gè)過程通過遞歸調(diào)用一層層來完成bean的創(chuàng)建和注入。這個(gè)注入主要有兩種辨嗽,一種是setter注入世落,通過反射來實(shí)現(xiàn)的,一種是構(gòu)造器注入糟需。
在整個(gè)Bean的創(chuàng)建和依賴注入完成之后屉佳,這個(gè)bean就不在是簡(jiǎn)單的java對(duì)象了,它還包含了對(duì)象之間的依賴關(guān)系洲押。下面我們就開始使用武花。
2 ApplicationContext和Bean的初始化以及銷毀
在Spring中,有兩類容器杈帐,一種是實(shí)現(xiàn)了BeanFactory的簡(jiǎn)單容器系列体箕。這個(gè)系列只實(shí)現(xiàn)了容器最基本的功能专钉。另外一種是ApplicationContext應(yīng)用上下文,它作為容器的高級(jí)形態(tài)存在累铅,在簡(jiǎn)單容器的基礎(chǔ)上跃须,增加了許多面向框架的特性。
.