Spring.Net IOC依賴注入原理流程解析
一。什么是IOC.(Inversion of Control)
IOC,即控制反轉。不是什么技術,而是一種思想。在傳統(tǒng)開發(fā)中,我們需要某個對象時,就手動去new一個依賴的對象。而IOC意味著將對象的控制權交給容器,而不在是直接在對象的內部控制。如何理解IOC呢?理解好IOC的關鍵是要明確‘誰控制了誰,控制了什么?為何是反轉?(有反轉既有正轉),哪些反面反轉了。'
誰控制了誰?控制了什么?:傳統(tǒng)程序設計,我們直接在對象內部通過new來創(chuàng)建對象,是程序主動去創(chuàng)建對象。而在ioc中,是通過一個容器去創(chuàng)建這些對象,即IOC容器控制對象的創(chuàng)建;誰控制了誰?當然是IOC容器創(chuàng)建了對象;控制了什么?當然是控制了外部資源的獲取。(不只是對象,比如包括文件等)
為何是反轉?哪些方面反轉了?:有反轉就有正轉。傳統(tǒng)應用程序由我們自己在對象中主動獲取創(chuàng)建依賴對象,也就是正轉;而反轉則是由容器來創(chuàng)建及注入依賴對象。為什么是反轉呢?因為由容器幫我們查找及注入依賴,對象只是被動的接受依賴對象,所以是反轉。哪些方面反轉了?依賴對象的獲取被反轉了。
圖列說明
圖一. 傳統(tǒng)程序設計,主動創(chuàng)建相關對象,再組合起來

圖二。當有了IOC/DI容器之后,客戶端不在主動創(chuàng)建這些對象

二。iOC能夠做什么?
IOC是一種思想,而不是新的技術。一個重要的面向對象編程的法則,它能指導我們如何設計出松耦合,更優(yōu)良的程序。傳統(tǒng)的應用程序都是我們在類的內部,主動的創(chuàng)建應用對象,從而導致類與類之間,高耦合,難于測試。有了IOC容器,就將查找和創(chuàng)建依賴對象的控制交給了容器,由容器進行注入組合對象,所以對象與對象之間,是松散耦合的,使得程序的整個體系結構變得非常靈活。
其實IOC對編程帶來最大的變化,不是從代碼上的,而是思想上,發(fā)生了‘主從換位'的變化。應用程序原本是老大,需要什么資源,都是主動去獲取。但是在IOC/DI中,應用程序變成了被動了,被動的等待容器來創(chuàng)建并注入它所需要的資源。
IOC很好的體現(xiàn)了面向對象設計原則,好萊塢法則:“別找我們,我們找你”。即由IOC容器幫對象去找依賴的對象,并注入,而不是由對象主動去找。
三。IOC和DI
DI(Dependency Injection),即依賴注入。是組件之間的關系由容器在在運行期確定,形象的說,即由容器動態(tài)的將某個依賴關系注入到組件之中。依賴注入的目的并非為軟件系統(tǒng)帶來更多功能,而是為了提升組件重用的頻率,并為系統(tǒng)搭建一個靈活、可擴展的平臺。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何代碼就可指定目標需要的資源,完成自身的業(yè)務邏輯,而不需要關心具體的資源來自何處,由誰實現(xiàn)。
理解DI的關鍵是:‘誰依賴了誰,為什么需要依賴,誰注入了誰,注入了什么':
誰依賴了誰:當然是應用程序依賴了容器為什么需要依賴:應用程序需要IOC容器提供對象所需要的資源誰注入了誰:很明顯是IOC容器注入應用程序某個對象,應用程序依賴的對象注入了什么:就是注入某個對象所需要的外部資源(包括對象,資源,文件,常量數(shù)據(jù))
IOC和DI之間,是同一個概念不同角度的描述。相對于IOC而言,“依賴注入“明確描述” 被注入對象依賴IOC容器配置依賴對象”。
四 。Spring.Net之IOC的配置
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
</sectionGroup>
</configSections>
<spring>
<context>
<!--加載容器所需的配置文件,默認是config文件.這里單獨定義一個文件xml,來配置容器.需要注意的是,xml文件屬性需要設置為始終復制或如果較新規(guī)則復制-->
<resource uri="config://spring/objects"/>
<resource uri="F:\\C#\\SpingNetIOCV2\\ioc\\ioc.xml"/>
</context>
<objects xmlns="http://www.springframework.net">
<!--<object name="myIoc" type="SpingNetIOCV2.model.Moveis,SpingNetIOCV2"></object>-->
</objects>
</spring
ioc.xml代碼段配置如下:
<?xml version="1.0" encoding="utf-8" ?> <objects> <object name="myIoc" type="SpingNetIOCV2.model.Moveis,SpingNetIOCV2"></object> </objects>
控制臺程序main方法中,引用Spring.Context命令空間,以便IApplicationContext接口訪問IOC容器。,下面通過容器,獲取一個創(chuàng)建的對象:
public static void Main(string[] args)
{
//獲取容器對象
IApplicationContext context = ContextRegistry.GetContext();
//通過容器創(chuàng)建對象
Moveis m =(Moveis)context.GetObject("myIoc");
Console.WriteLine(m.GetType().Name);//結果輸出Moveis
Console.ReadKey();
}
A。通過屬性注入依賴對象
<?xml version="1.0" encoding="utf-8" ?>
<objects>
<!--MovieLister對象,依賴SimpleMovieTXTFinder獲取對應的電影資源-->
<object name="myIoc" type="SpingNetIOCV2.model.MovieLister,SpingNetIOCV2">
<property name="move" ref="SimpleMovieTXTFinder"></property>
</object>
<!--SimpleMovieTXTFinder類是加載獲取存儲在txt文本中的電影信息工具類-->
<object name="SimpleMovieTXTFinder" type="SpingNetIOCV2.model.SimpleMovieTXTFinder,SpingNetIOCV2"></object>
</objects>
public static void Main(string[] args)
{
//獲取容器對象
IApplicationContext context = ContextRegistry.GetContext();
//通過容器創(chuàng)建對象
//Moveis m =(Moveis)context.GetObject("myIoc");
//通過屬性注入(set值方法注入)。對象MovieLister依賴IMoveis,通過容器創(chuàng)建依賴對象,注入到對象MovieLister的move屬性中
//容器先創(chuàng)建MovieLister對象,看MovieLister類是否需要注入。如果需要注入,則創(chuàng)建所需的依賴對象SimpleMovieTXTFinder,然后通過屬性。注入到MovieLister對象中
MovieLister ml = (MovieLister)context.GetObject("myIoc");
Console.WriteLine(ml.GetType().Name);//結果輸出MovieLister
ml.GetMoves(1);
Console.ReadKey();
}
B。構造器注入依賴
<?xml version="1.0" encoding="utf-8" ?>
<objects>
<!--MovieLister對象,依賴SimpleMovieTXTFinder獲取對應的電影資源-->
<object name="myIoc" type="SpingNetIOCV2.model.MovieLister,SpingNetIOCV2">
<property name="move" ref="SimpleMovieTXTFinder"></property>
</object>
<!--SimpleMovieTXTFinder類是加載獲取存儲在txt文本中的電影信息工具類-->
<object name="SimpleMovieTXTFinder" type="SpingNetIOCV2.model.SimpleMovieTXTFinder,SpingNetIOCV2">
<!--<constructor-arg/>節(jié)點就是用來為構造器提供參數(shù)的IoC容器使用某個內置的類型轉換器將字符串“move.txt”轉換為System.IO.FileInfo-->
<constructor-arg index="0" value="../../move.txt"/>
</object>
</objects>
文本move.text是電影文本列表,IOC容器通過構造器注入,將外部資源注入到了MovieLister對象中。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot前端傳遞數(shù)組后端接收兩種常用的方法
這篇文章主要給大家介紹了關于SpringBoot前端傳遞數(shù)組后端接收兩種常用的方法,文中通過代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-04-04
SpringBoot中的server.context-path的實現(xiàn)
本文主要介紹了SpringBoot中的server.context-path的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-08-08
SpringBoot教程_創(chuàng)建第一個SpringBoot項目
這篇文章主要介紹了SpringBoot教程_創(chuàng)建第一個SpringBoot項目,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06
postman測試傳入List<String>參數(shù)方式
這篇文章主要介紹了postman測試傳入List<String>參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08

