個(gè)人名片:
??作者簡(jiǎn)介:一名大二在校生
?????個(gè)人主頁(yè):落798.
??個(gè)人WeChat:落798.
???系列專欄:零基礎(chǔ)學(xué)java ----- 重識(shí)c語(yǔ)言 ---- 計(jì)算機(jī)網(wǎng)絡(luò)—【Spring技術(shù)內(nèi)幕】
??每日一句:看淡一點(diǎn)在努力,你吃的苦會(huì)鋪成你要的路!
2.1 Spring IoC容器概述
Spring 容器是 Spring 框架的核心。 容器將創(chuàng)建對(duì)象、將它們連接在一起、配置它們并管理它們從創(chuàng)建到銷毀的完整生命周期。 Spring 容器使用 DI 管理構(gòu)成應(yīng)用程序的組件。 這些對(duì)象稱為 Spring Bean。
容器通過(guò)讀取提供的配置元數(shù)據(jù)來(lái)獲取關(guān)于要實(shí)例化、配置和組裝哪些對(duì)象的指令。 配置元數(shù)據(jù)可以由 XML、Java 注解或 Java 代碼表示。 下圖展示了 Spring 工作原理的高級(jí)視圖。 Spring IoC 容器利用 Java POJO 類和配置元數(shù)據(jù)來(lái)生成一個(gè)完全配置和可執(zhí)行的系統(tǒng)或應(yīng)用程序。
Spring IoC負(fù)責(zé)創(chuàng)建對(duì)象、管理對(duì)象(通過(guò)依賴注入(DI)、裝配對(duì)象、配置對(duì)象,并且管理這些對(duì)象的整個(gè)生命周期。
其實(shí)IoC包括依賴查找(DL)和依賴注入(DI);只不過(guò)DL因?yàn)橛星秩胄?(它需要用戶自己去是使用 API 進(jìn)行查找資源和組裝對(duì)象),已經(jīng)被拋棄。所以現(xiàn)在提到IoC,更多的想到的就是依賴注入(DI)了。
-
IOC: Spring 反向控制應(yīng)用程序需要的資源。
-
DI: 應(yīng)用程序依賴Spring為其提供資源。
其中的DI—Dependency Injection,即“依賴注入”:組件之間依賴關(guān)系由容器在運(yùn)行期決定,形象的說(shuō),即由容器動(dòng)態(tài)的將某個(gè)依賴關(guān)系注入到組件之中。依賴注入的目的并非為軟件系統(tǒng)帶來(lái)更多功能,而是為了提升組件重用的頻率,并為系統(tǒng)搭建一個(gè)靈活、可擴(kuò)展的平臺(tái)。通過(guò)依賴注入機(jī)制,我們只需要通過(guò)簡(jiǎn)單的配置,而無(wú)需任何代碼就可指定目標(biāo)需要的資源,完成自身的業(yè)務(wù)邏輯,而不需要關(guān)心具體的資源來(lái)自何處,由誰(shuí)實(shí)現(xiàn)。
理解DI的關(guān)鍵是:“誰(shuí)依賴誰(shuí),為什么需要依賴,誰(shuí)注入誰(shuí),注入了什么”。
誰(shuí)依賴于誰(shuí):
- 當(dāng)然是應(yīng)用程序依賴于IoC容器;
為什么需要依賴:
- 應(yīng)用程序需要IoC容器來(lái)提供對(duì)象需要的外部資源;
誰(shuí)注入誰(shuí):
- 很明顯是IoC容器注入應(yīng)用程序某個(gè)對(duì)象,應(yīng)用程序依賴的對(duì)象;
注入了什么:
- 就是注入某個(gè)對(duì)象所需要的外部資源(包括對(duì)象、資源、常量數(shù)據(jù))。
2.1.1IoC容器的依賴反轉(zhuǎn)模式
依賴反轉(zhuǎn)是一種軟件設(shè)計(jì)原則,它使得高層模塊不依賴于低層模塊的具體實(shí)現(xiàn),而是依賴于抽象接口或者抽象類。
在傳統(tǒng)的開發(fā)中,對(duì)象的創(chuàng)建和管理通常由對(duì)象自身負(fù)責(zé),一個(gè)對(duì)象會(huì)直接創(chuàng)建并管理其所依賴的其他對(duì)象。這種情況下,高層模塊對(duì)低層模塊的實(shí)現(xiàn)產(chǎn)生了依賴,導(dǎo)致代碼的耦合度增加。
具體來(lái)說(shuō),Spring的IoC容器將對(duì)象的創(chuàng)建和管理以及對(duì)象間的依賴關(guān)系的處理交給了容器來(lái)完成。開發(fā)人員只需要在配置文件或注解中聲明對(duì)象的依賴關(guān)系,而不需要顯式地去創(chuàng)建對(duì)象或解決對(duì)象之間的依賴。
org.springframework.beans
和 org.springframework.context 包是Spring Framework
的IoC容器的基礎(chǔ)。 BeanFactory
接口提供了一種高級(jí)配置機(jī)制,能夠管理任何類型的對(duì)象。 ApplicationContext
是 BeanFactory
的一個(gè)子接口。它增加了:
- 更容易與Spring的AOP功能集成
- Message resource 處理(用于國(guó)際化)
- 事件發(fā)布
- 應(yīng)用層的特定上下文,如 WebApplicationContext,用于 web 應(yīng)用
簡(jiǎn)而言之,BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 則增加了更多的企業(yè)特定功能。ApplicationContext 是 BeanFactory 的一個(gè)完整的超集。
在Spring中,構(gòu)成你的應(yīng)用程序的骨干并由Spring IoC容器管理的對(duì)象被稱為Bean。Bean是一個(gè)由Spring IoC容器實(shí)例化、組裝和管理的對(duì)象。否則,Bean只是你的應(yīng)用程序中眾多對(duì)象中的一個(gè)。Bean以及它們之間的依賴關(guān)系都反映在容器使用的配置元數(shù)據(jù)中。
2.1.2 IoC容器的兩種表現(xiàn)形式
容器 | 描述 |
---|---|
Spring BeanFactory 容器 |
這是為 DI 提供基本支持的最簡(jiǎn)單的容器,由 org.springframework.beans.factory.BeanFactory 接口定義。 Spring 中仍然存在 BeanFactory 及其相關(guān)接口,如BeanFactoryAware 、InitializingBean 、DisposableBean ,目的是為了向后兼容大量與 Spring 集成的第三方框架。 |
Spring ApplicationContext 容器 |
此容器添加了更多特定于企業(yè)的功能,例如從屬性文件解析文本消息的能力以及將應(yīng)用程序事件發(fā)布到感興趣的事件偵聽器的能力。 這個(gè)容器由 org.springframework.context.ApplicationContext 接口定義。 |
2.1.3 IoC容器的介紹和使用:
BeanFactory容器的使用:
這是為 DI 提供基本支持的最簡(jiǎn)單的容器,由 org.springframework.beans.factory.BeanFactory 接口定義。 Spring中仍然存在BeanFactory及其相關(guān)接口,如BeanFactoryAware、InitializingBean、DisposableBean,目的是為了向后兼容大量與Spring集成的第三方框架。
有許多 BeanFactory 接口的實(shí)現(xiàn)直接隨 Spring 提供。 最常用的 BeanFactory 實(shí)現(xiàn)是 XmlBeanFactory 類。 此容器從 XML 文件中讀取配置元數(shù)據(jù),并使用它來(lái)創(chuàng)建完全配置的系統(tǒng)或應(yīng)用程序。
在資源有限的情況下,如移動(dòng)設(shè)備或基于小程序的應(yīng)用程序,BeanFactory 通常是首選。 因此,除非您有充分的理由不這樣做,否則請(qǐng)使用 ApplicationContext。
public static void main(String[] args){
//ClassPathResource加載在路徑CLASSPATH下可用的xml配置文件
//XmlBeanFactory負(fù)責(zé)創(chuàng)建并初始化所有對(duì)象即xml文件中的bean
XmlFactory factory = new XmlBeanFactory(new ClassPathResource("_.xml"));
類名 對(duì)象名 =(類名)factory.getBean("_");
}
ApplicationContext 容器的使用:
Application Context 應(yīng)用程序上下文是 Spring 的高級(jí)容器。 與 BeanFactory 類似,它可以加載 bean 定義、將 bean 連接在一起并根據(jù)請(qǐng)求分發(fā) bean。 此外,它還添加了更多特定于企業(yè)的功能,例如從屬性文件解析文本消息的能力以及將應(yīng)用程序事件發(fā)布到感興趣的事件偵聽器的能力。 該容器由 org.springframework.context.ApplicationContext 接口定義。
常用的 ApplicationContext 實(shí)現(xiàn):
-
FileSystemXmlApplicationContext
? 這個(gè)容器從一個(gè) XML 文件中加載 bean 的定義。 這里需要將 XML bean 配置文件的完整路徑提供給構(gòu)造函數(shù)。 -
ClassPathXmlApplicationContext
? 這個(gè)容器從一個(gè) XML 文件中加載 bean 的定義。 這里您不需要提供 XML 文件的完整路徑,但您需要正確設(shè)置 CLASSPATH,因?yàn)榇巳萜骺雌饋?lái)像 CLASSPATH 中的 bean 配置 XML 文件。 -
WebXmlApplicationContext
? 此容器從 Web 應(yīng)用程序中加載包含所有 bean 定義的 XML 文件。
public static void main(String[] args){
//ApplicationContext接口的實(shí)現(xiàn)類有很多種,這里使用ClassPathXmlApplicationContext
ApplicationContext app = new ClassPathXmlApplicationContext("_.xml");
類名 對(duì)象名 =(類名)app.getBean("_");
}
下期預(yù)告: Bean 概述以及如何構(gòu)建和使用容器
一個(gè)Spring IoC容器管理著一個(gè)或多個(gè)Bean。這些Bean是用你提供給容器的配置元數(shù)據(jù)創(chuàng)建的(例如,以XML 定義的形式)。
在容器本身中,這些Bean定義被表示為 BeanDefinition 對(duì)象,它包含(除其他信息外)以下元數(shù)據(jù)。
-
一個(gè)全路徑類名:通常,被定義的Bean的實(shí)際實(shí)現(xiàn)類。
-
Bean的行為配置元素,它說(shuō)明了Bean在容器中的行為方式(scope、生命周期回調(diào),等等)。
-
對(duì)其他Bean的引用,這些Bean需要做它的工作。這些引用也被稱為合作者或依賴。
-
要在新創(chuàng)建的對(duì)象中設(shè)置的其他配置設(shè)置—?例如,pool的大小限制或在管理連接池的Bean中使用的連接數(shù)。
寫在后面??????:
本專欄是自己深入學(xué)習(xí)并結(jié)合Spring技術(shù)內(nèi)幕一經(jīng)典圖書內(nèi)容做出的的心得與總結(jié),將其精簡(jiǎn)編寫成一篇專欄供大家學(xué)習(xí),希望對(duì)新學(xué)習(xí)Spring框架技術(shù)的小伙伴有所幫助。
圖書推薦:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-612986.html
歡迎添加微信,加入我的核心小隊(duì),請(qǐng)備注來(lái)意
??????????????????????????????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-612986.html
到了這里,關(guān)于Spring Framework的核心:IoC容器的實(shí)現(xiàn)(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!