這篇文章給大家介紹怎么分析Spring中的IOC容器,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
成都創(chuàng)新互聯(lián)主要業(yè)務(wù)有網(wǎng)站營銷策劃、成都網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號開發(fā)、成都微信小程序、H5網(wǎng)站設(shè)計、程序開發(fā)等業(yè)務(wù)。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶當客戶,還把客戶視為我們的合作伙伴,在開展業(yè)務(wù)的過程中,公司還積累了豐富的行業(yè)經(jīng)驗、營銷型網(wǎng)站資源和合作伙伴關(guān)系資源,并逐漸建立起規(guī)范的客戶服務(wù)和保障體系。
1.1 IoC概述
IoC(Inverse of Control,控制反轉(zhuǎn))是Spring容器的內(nèi)核,AOP、聲明式事務(wù)等功能在此基礎(chǔ)上開花結(jié)構(gòu)。不過IoC確實包括很多內(nèi)涵,涉及代碼解耦、設(shè)計模式、代碼優(yōu)化等問題的考量。
先來講下如下場景:
《墨攻》中有個場景,劉德華飾演的墨者革離來到梁國城下,梁國守衛(wèi)問道:“來者何人?”劉德華回答:“墨者革離”。
有如下幾種代碼實現(xiàn)方式:


其實可以這么理解:飾演革離人物角色的,有多種選擇,不一定是劉德華,這個控制權(quán)掌握在導(dǎo)演手里,所以最終的圖示關(guān)系就是如下圖:

那到底是什么東西的“控制”被“反轉(zhuǎn)”了呢?對應(yīng)到前面的例子,“控制”是指選擇GeLi角色扮演者的控制權(quán);“反轉(zhuǎn)”是指這種控制權(quán)從《墨攻》劇本中移除,轉(zhuǎn)交到導(dǎo)演受眾。對于軟件來說,即某一接口具體實現(xiàn)類的選擇控制權(quán)從調(diào)用類中移除,轉(zhuǎn)交到第三方?jīng)Q定,即由Spring容器借由Bean配置來進行控制。
控制反轉(zhuǎn)還是比較晦澀難懂,那么軟件界的泰斗級人物Martin Fowler提出了DI(Dependency Injection,依賴注入)的概念來代替IoC。
1.1.2 IoC的類型
1. 構(gòu)造函數(shù)注入
2. 屬性注入
3. 接口注入
1.1.3 通過容器完成依賴關(guān)系的注入
所謂媒體“海選”和第三方代理機構(gòu),在程序領(lǐng)域就是一個第三方的容器,他幫助完成類的初始化與裝配工作,讓開發(fā)者從這些底層實現(xiàn)類的實例化、依賴關(guān)系裝配等工作中解脫出來,專注于更有意義的業(yè)務(wù)邏輯開發(fā)工作。這無疑是一件令人向往的事情。Spring就是這樣的一個容器,它通過配置文件或注解描述類和類之間的依賴關(guān)系,自動完成類的初始化和依賴注入工作。
1.2 相關(guān)Java基礎(chǔ)知識
Java語言允許通過程序化的方式間接對Class進行操作。Class文件由類裝載器裝載后,在JVM中獎形成一份描述Class結(jié)構(gòu)的元信息對象,通過該元信息對象可以獲知Class的結(jié)構(gòu)信息,如構(gòu)造函數(shù)、屬性和方法等。Java允許用戶借由這個與Class相關(guān)的元信息對象間接調(diào)用Class對象的功能,這就為使用程序化方式操作Class對象開辟了途徑。
1.2.2 類裝載器 ClassLoader
1. 類裝載器的工作機制
類裝載器把一個類裝入JVM中,需要經(jīng)過一下步驟:
(1)裝載:查找和導(dǎo)入Class文件
(2)鏈接:執(zhí)行校驗、準備和解析步驟,其中解析步驟是可以選擇的。
1. 校驗:檢查載入Class文件數(shù)據(jù)的正確性。
2. 準備:給類的靜態(tài)變量分配存儲空間。
3. 解析:將符號引用轉(zhuǎn)換成直接引用。
(3)初始化:對類的靜態(tài)變量、靜態(tài)代碼塊執(zhí)行初始化工作。

1.2.3 Java反射機制
Java的反射體系保證了可以通過程序化的方式訪問目標類中的所有的元素,對于private或protexted成員變量和方法,只要JVM的安全機制允許,也可以通過反射進行調(diào)用。
1.3.1 資源抽象接口
JDK所提供的訪問資源的類(如 java.net.URL、FIle等)并不能很好的滿足各種底層資源的訪問需求,比如缺少從類路徑或者Web容器上下文獲取資源的操作類,鑒于此,Spring設(shè)計了一個Resource接口,它為應(yīng)用提供了更強的底層資源訪問能力。


1.4 BeanFactory 和 ApplicationContext
Spring 通過一個配置文件描述Bean及Bean之間的依賴關(guān)系,利用Java語言的反射功能實例化Bean并建立Bean之間的依賴關(guān)系。Spirng的IoC容器在完成這些底層工作的基礎(chǔ)上,還提供了Bean實例緩存、生命周期管理、Bean實例代理、事件發(fā)布、資源裝載等高級服務(wù)。
我們一般稱BeanFactory為IoC容器,而稱ApplicationContext為應(yīng)用上下文。但有時為了行文方便,我們也將ApplicationContext稱為Spring容器。
BeanFactory是Spring框架的基礎(chǔ)設(shè)施,面向Spring本身;ApplicaitonContext面向使用Spring框架的開發(fā)者,幾乎所有的應(yīng)用場合都可以使用ApplicationContext而非底層的BeanFactory。
1. 初始化BeanFactory
1) 對于單實例的Bean來說,BeanFactory會緩存Bean實例,所以第二次使用getBean()獲取Bean時,將直接從IoC容器的緩存中獲取Bean實例。
2) 在Spring中,DefaultSingletonBeanRegistry類中提供了一個用于緩存單實例Bean的緩存器,它是一個用HashMap實現(xiàn)的緩存器,單實例的Bean以beanName為鍵保存在這個HashMap中。
3) 在初始化BeanFactory時,必須提供一種日志框架
1.4.2 ApplicationContext介紹
如果說BeanFactory是Spring的“心臟”,那么ApplicationContext就是完整的“身軀”了。
1. ApplicationContext類體系結(jié)構(gòu),它是一個接口,代碼如下:
public interface ApplicationContext extends ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
String getId();
String getDisplayName();
long getStartupDate();
ApplicationContext getParent();
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
1)ApplicationEventPublisher: 讓容器擁有發(fā)布應(yīng)用上下文事件的功能,包括容器啟動事件、關(guān)閉事件。
2)MessageSource: 為應(yīng)用提供i18n國際化消息訪問的功能
3)ResourcePatternResolver: 所有ApplicationContext實現(xiàn)類都實現(xiàn)了類似于PathMatchingResourcePatternResolver的功能,可以通過帶前綴的Ant風格的資源文件路徑裝載Spring的配置文件。
4)LifeCycle: 該接口提供了start()和stop()兩個方法,主要用于控制異步處理過程。
初始化ApplicationContext的幾種方式:
1)如果配置文件放置在類路徑下,則可以優(yōu)先考慮使用ClassPathXmlApplicationContext實現(xiàn)類

2)如果配置文件放置在文件系統(tǒng)的路徑下,則可以優(yōu)先考慮使用FileSystemXml

3)基于注解的配置方式如下:


4)基于Groovy DSL來配置Bean
2. WebApplicationContext類體系結(jié)構(gòu)
在非Web應(yīng)用的環(huán)境下,Bean只有singletom和prototype兩種作用域。WebApplicationContext為Bean添加了三個新的作用域:request、session和global session.
ConfigurableWebApplicationContext擴展了WebApplicationContext,它允許通過配置的方式實例化WebApplicationContext,同時定義了兩個重要的方法。
setServletContext(ServletContext context):為Spring設(shè)置Web應(yīng)用上下文,以便二者整合。
setConfigLocations(String[] configLocation): 設(shè)置Spring配置文件地址。
3. WebApplicationContext初始化
1)使用配置文件
2)使用注解的方式
3)使用Groovy DSL的方式
1.4.3 父子容器
通過HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子層級關(guān)聯(lián)的容器體系,子容器可以訪問如容器中的Bean,但是父容器不能訪問自容器中的Bean。
例如:Spring使用父子容器實現(xiàn)很多功能,比如在Spring MVC中,展現(xiàn)層Bean位于一個子容器中,而業(yè)務(wù)層和持久層Bean位于如容器中。這樣,展現(xiàn)層Bean就可以引用業(yè)務(wù)層和持久層Bean,而業(yè)務(wù)層和持久層Bean則看不到展現(xiàn)層Bean。
1.5.1 BeanFactory中的Bean的生命周期
Spring為Bean提供了細致周全的生命周期過程,通過實現(xiàn)特定的接口或通過<bean>屬性設(shè)置,都可以對Bean的生命周期過程施加影響。Bean的生命周期不但和其實現(xiàn)的接口相關(guān),還與Bean的作用范圍有關(guān)。為了讓Bean綁定在Spring框架上,我們推薦使用配置方式而非接口方式進行Bean生命周期的控制。
關(guān)于怎么分析Spring中的IOC容器就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
文章題目:怎么分析Spring中的IOC容器
URL分享:http://www.chinadenli.net/article6/gpohig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、移動網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)、網(wǎng)站制作、虛擬主機、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)