色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

Spring.Net IOC依賴注入原理流程解析

瀏覽:4日期:2023-08-26 15:54:19

一。什么是IOC.(Inversion of Control)

IOC,即控制反轉(zhuǎn)。不是什么技術(shù),而是一種思想。在傳統(tǒng)開發(fā)中,我們需要某個對象時,就手動去new一個依賴的對象。而IOC意味著將對象的控制權(quán)交給容器,而不在是直接在對象的內(nèi)部控制。如何理解IOC呢?理解好IOC的關(guān)鍵是要明確‘誰控制了誰,控制了什么?為何是反轉(zhuǎn)?(有反轉(zhuǎn)既有正轉(zhuǎn)),哪些反面反轉(zhuǎn)了。’

誰控制了誰?控制了什么?:傳統(tǒng)程序設(shè)計(jì),我們直接在對象內(nèi)部通過new來創(chuàng)建對象,是程序主動去創(chuàng)建對象。而在ioc中,是通過一個容器去創(chuàng)建這些對象,即IOC容器控制對象的創(chuàng)建;誰控制了誰?當(dāng)然是IOC容器創(chuàng)建了對象;控制了什么?當(dāng)然是控制了外部資源的獲取。(不只是對象,比如包括文件等)

為何是反轉(zhuǎn)?哪些方面反轉(zhuǎn)了?:有反轉(zhuǎn)就有正轉(zhuǎn)。傳統(tǒng)應(yīng)用程序由我們自己在對象中主動獲取創(chuàng)建依賴對象,也就是正轉(zhuǎn);而反轉(zhuǎn)則是由容器來創(chuàng)建及注入依賴對象。為什么是反轉(zhuǎn)呢?因?yàn)橛扇萜鲙臀覀儾檎壹白⑷胍蕾嚕瑢ο笾皇潜粍拥慕邮芤蕾噷ο螅允欠崔D(zhuǎn)。哪些方面反轉(zhuǎn)了?依賴對象的獲取被反轉(zhuǎn)了。

圖列說明

圖一. 傳統(tǒng)程序設(shè)計(jì),主動創(chuàng)建相關(guān)對象,再組合起來

Spring.Net IOC依賴注入原理流程解析

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

Spring.Net IOC依賴注入原理流程解析

二。iOC能夠做什么?

IOC是一種思想,而不是新的技術(shù)。一個重要的面向?qū)ο缶幊痰姆▌t,它能指導(dǎo)我們?nèi)绾卧O(shè)計(jì)出松耦合,更優(yōu)良的程序。傳統(tǒng)的應(yīng)用程序都是我們在類的內(nèi)部,主動的創(chuàng)建應(yīng)用對象,從而導(dǎo)致類與類之間,高耦合,難于測試。有了IOC容器,就將查找和創(chuàng)建依賴對象的控制交給了容器,由容器進(jìn)行注入組合對象,所以對象與對象之間,是松散耦合的,使得程序的整個體系結(jié)構(gòu)變得非常靈活。

其實(shí)IOC對編程帶來最大的變化,不是從代碼上的,而是思想上,發(fā)生了‘主從換位’的變化。應(yīng)用程序原本是老大,需要什么資源,都是主動去獲取。但是在IOC/DI中,應(yīng)用程序變成了被動了,被動的等待容器來創(chuàng)建并注入它所需要的資源。

IOC很好的體現(xiàn)了面向?qū)ο笤O(shè)計(jì)原則,好萊塢法則:“別找我們,我們找你”。即由IOC容器幫對象去找依賴的對象,并注入,而不是由對象主動去找。

三。IOC和DI

DI(Dependency Injection),即依賴注入。是組件之間的關(guān)系由容器在在運(yùn)行期確定,形象的說,即由容器動態(tài)的將某個依賴關(guān)系注入到組件之中。依賴注入的目的并非為軟件系統(tǒng)帶來更多功能,而是為了提升組件重用的頻率,并為系統(tǒng)搭建一個靈活、可擴(kuò)展的平臺。通過依賴注入機(jī)制,我們只需要通過簡單的配置,而無需任何代碼就可指定目標(biāo)需要的資源,完成自身的業(yè)務(wù)邏輯,而不需要關(guān)心具體的資源來自何處,由誰實(shí)現(xiàn)。

理解DI的關(guān)鍵是:‘誰依賴了誰,為什么需要依賴,誰注入了誰,注入了什么’:

誰依賴了誰:當(dāng)然是應(yīng)用程序依賴了容器為什么需要依賴:應(yīng)用程序需要IOC容器提供對象所需要的資源誰注入了誰:很明顯是IOC容器注入應(yīng)用程序某個對象,應(yīng)用程序依賴的對象注入了什么:就是注入某個對象所需要的外部資源(包括對象,資源,文件,常量數(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> <!--加載容器所需的配置文件,默認(rèn)是config文件.這里單獨(dú)定義一個文件xml,來配置容器.需要注意的是,xml文件屬性需要設(shè)置為始終復(fù)制或如果較新規(guī)則復(fù)制--> <resource uri='config://spring/objects'/> <resource uri='F:C#SpingNetIOCV2iocioc.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);//結(jié)果輸出Moveis Console.ReadKey(); }

A。通過屬性注入依賴對象 

<?xml version='1.0' encoding='utf-8' ?><objects> <!--MovieLister對象,依賴SimpleMovieTXTFinder獲取對應(yīng)的電影資源--> <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);//結(jié)果輸出MovieLister ml.GetMoves(1); Console.ReadKey(); }

B。構(gòu)造器注入依賴

<?xml version='1.0' encoding='utf-8' ?><objects> <!--MovieLister對象,依賴SimpleMovieTXTFinder獲取對應(yīng)的電影資源--> <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é)點(diǎn)就是用來為構(gòu)造器提供參數(shù)的IoC容器使用某個內(nèi)置的類型轉(zhuǎn)換器將字符串“move.txt”轉(zhuǎn)換為System.IO.FileInfo--> <constructor-arg index='0' value='../../move.txt'/> </object></objects>

文本move.text是電影文本列表,IOC容器通過構(gòu)造器注入,將外部資源注入到了MovieLister對象中。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 欧美一级毛级毛片 | 毛片免费视频观看 | 日韩亚洲一区二区三区 | 亚洲性久久久影院 | 中文久草| 欧美自拍另类 | 国产亚洲久久 | 真实的国产乱xxxx | 美女黄视频在线观看 | 成网站在线观看人免费 | 精品国产香蕉伊思人在线 | 高清国产一级精品毛片基地 | 久久精品国产亚洲精品2020 | 亚州人成网在线播放 | 久久久欧美综合久久久久 | 久久国产成人亚洲精品影院老金 | 成人精品一区二区久久 | 一本本久综合久久爱 | 亚洲精品韩国美女在线 | 亚洲欧美日韩精品久久亚洲区色播 | 99re热在线视频 | 中国一级毛片录像 | 免费看一级欧美毛片视频 | 国产亚洲精品成人一区看片 | 日本成人在线免费 | 成人午夜影视全部免费看 | 欧美精品在线一区二区三区 | 日本视频免费在线播放 | 视频二区欧美 | 成人中文字幕在线高清 | 欧美性猛片xxxxⅹ免费 | 波野多结衣在线观看 | 中国日本高清免费视频网 | japanese日本舒服丰满 | 国产高清美女一级a毛片久久 | 黑人一级片 | 久久精品国产99久久香蕉 | 久久一区二区精品 | 久久不射网 | 色屁屁一区二区三区视频国产 | 亚洲一级毛片免费看 |