學(xué)習(xí)IOC

1:IOC

IOC作為Spring容器的核心。成功完成了對(duì)象依賴(lài)關(guān)系的管理權(quán)的反轉(zhuǎn)。

在起初的開(kāi)發(fā)過(guò)程中:許多應(yīng)用都是多個(gè)類(lèi)通過(guò)彼此的合作來(lái)實(shí)現(xiàn)業(yè)務(wù)邏輯的,這使得每個(gè)對(duì)象都需要與其合作的對(duì)象的引用,如果這個(gè)獲取過(guò)程由對(duì)象自己來(lái)完成,那么將導(dǎo)致代碼的高度耦合和難以測(cè)試。

依賴(lài)反轉(zhuǎn)是依賴(lài)對(duì)象的獲取被反轉(zhuǎn)。這種對(duì)象之間的依賴(lài)關(guān)系注入交給了框架和IOC容器來(lái)管理。

Spring通過(guò)定義了BeanDefinition這種核心的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)依賴(lài)反轉(zhuǎn)功能的。

BeanDefinition是用來(lái)管理基于Spring的應(yīng)用中的各種對(duì)象以及他們之間的相互關(guān)系。

1.1 IOC容器初始化過(guò)程

ioc容器的初始化是由refresh()方法的啟動(dòng)來(lái)開(kāi)始的。整個(gè)工程主要分為三大步。

1:加載配置文件。其實(shí)就是Resource的定位過(guò)程。

這一步主要是由ResourceLoader通過(guò)Resource接口來(lái)完成的。就是去尋找各種相關(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:通過(guò)調(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ù)類(lèi)型。整個(gè)過(guò)程可以看成是一個(gè)反射獲取數(shù)據(jù)的過(guò)程。

3:將解析生成好的BeanDefinition注冊(cè)到IOC容器上。

這個(gè)過(guò)程最為重要,這個(gè)過(guò)程是通過(guò)調(diào)用BeanDefinitionRegistry接口來(lái)實(shí)現(xiàn)的。通過(guò)分析,在IOC容器內(nèi)部將BeanDefinition注入到了一個(gè)hashMap中,IOC容器就是通過(guò)整個(gè)HashMap來(lái)持有這些BeanDefinition數(shù)據(jù)的。

DefaultListableBeanFactory

private final MapbeanDefinitionMap = new ConcurrentHashMap(256);

把Bean的名字。beanName作為一個(gè)key,BeanDefinition作為一個(gè)value放到整個(gè)IOC容器所持有的Map中。

需要注意的是,現(xiàn)在還是在IOC容器初始化的階段。還沒(méi)有包含Bean依賴(lài)注入的實(shí)現(xiàn),在Spring的設(shè)計(jì)中,Bean定義的載入和依賴(lài)注入是兩個(gè)獨(dú)立的過(guò)程。依賴(lài)注入一般是應(yīng)用在第一次通過(guò)·getBean向容器索取Bean的時(shí)候。也有一個(gè)例外。就是可以配置lazy-init屬性來(lái)完成對(duì)Bean的實(shí)例化。

1.2 IOC容器的依賴(lài)注入

依賴(lài)注入的起點(diǎn)就是getBean方法。之后會(huì)調(diào)用createBean方法。這個(gè)createBean不僅是根據(jù)整個(gè)BeanDefinition定義的要求來(lái)生成,同時(shí)還對(duì)Bean的初始化進(jìn)行了處理。整個(gè)過(guò)程通過(guò)遞歸調(diào)用一層層來(lái)完成bean的創(chuàng)建和注入。這個(gè)注入主要有兩種,一種是setter注入,通過(guò)反射來(lái)實(shí)現(xiàn)的,一種是構(gòu)造器注入。

在整個(gè)Bean的創(chuàng)建和依賴(lài)注入完成之后,這個(gè)bean就不在是簡(jiǎn)單的java對(duì)象了,它還包含了對(duì)象之間的依賴(lài)關(guān)系。下面我們就開(kāi)始使用。

2 ApplicationContext和Bean的初始化以及銷(xiāo)毀

在Spring中,有兩類(lèi)容器,一種是實(shí)現(xiàn)了BeanFactory的簡(jiǎn)單容器系列。這個(gè)系列只實(shí)現(xiàn)了容器最基本的功能。另外一種是ApplicationContext應(yīng)用上下文,它作為容器的高級(jí)形態(tài)存在,在簡(jiǎn)單容器的基礎(chǔ)上,增加了許多面向框架的特性。


.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容