电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

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

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

IOC,即控制反轉。不是什么技術,而是一種思想。在傳統開發中,我們需要某個對象時,就手動去new一個依賴的對象。而IOC意味著將對象的控制權交給容器,而不在是直接在對象的內部控制。如何理解IOC呢?理解好IOC的關鍵是要明確‘誰控制了誰,控制了什么?為何是反轉?(有反轉既有正轉),哪些反面反轉了?!?/p>

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

為何是反轉?哪些方面反轉了?:有反轉就有正轉。傳統應用程序由我們自己在對象中主動獲取創建依賴對象,也就是正轉;而反轉則是由容器來創建及注入依賴對象。為什么是反轉呢?因為由容器幫我們查找及注入依賴,對象只是被動的接受依賴對象,所以是反轉。哪些方面反轉了?依賴對象的獲取被反轉了。

圖列說明

圖一. 傳統程序設計,主動創建相關對象,再組合起來

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

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

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

二。iOC能夠做什么?

IOC是一種思想,而不是新的技術。一個重要的面向對象編程的法則,它能指導我們如何設計出松耦合,更優良的程序。傳統的應用程序都是我們在類的內部,主動的創建應用對象,從而導致類與類之間,高耦合,難于測試。有了IOC容器,就將查找和創建依賴對象的控制交給了容器,由容器進行注入組合對象,所以對象與對象之間,是松散耦合的,使得程序的整個體系結構變得非常靈活。

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

IOC很好的體現了面向對象設計原則,好萊塢法則:“別找我們,我們找你”。即由IOC容器幫對象去找依賴的對象,并注入,而不是由對象主動去找。

三。IOC和DI

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

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

誰依賴了誰:當然是應用程序依賴了容器為什么需要依賴:應用程序需要IOC容器提供對象所需要的資源誰注入了誰:很明顯是IOC容器注入應用程序某個對象,應用程序依賴的對象注入了什么:就是注入某個對象所需要的外部資源(包括對象,資源,文件,常量數據)

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文件屬性需要設置為始終復制或如果較新規則復制--> <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容器。,下面通過容器,獲取一個創建的對象:

public static void Main(string[] args) { //獲取容器對象 IApplicationContext context = ContextRegistry.GetContext(); //通過容器創建對象 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(); //通過容器創建對象 //Moveis m =(Moveis)context.GetObject('myIoc'); //通過屬性注入(set值方法注入)。對象MovieLister依賴IMoveis,通過容器創建依賴對象,注入到對象MovieLister的move屬性中 //容器先創建MovieLister對象,看MovieLister類是否需要注入。如果需要注入,則創建所需的依賴對象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/>節點就是用來為構造器提供參數的IoC容器使用某個內置的類型轉換器將字符串“move.txt”轉換為System.IO.FileInfo--> <constructor-arg index='0' value='../../move.txt'/> </object></objects>

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 汕头市盛大文化传播有限公司,www.11400.cc | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 家乐事净水器官网-净水器厂家「官方」| 磁粉制动器|张力控制器|气胀轴|伺服纠偏控制器整套厂家--台灵机电官网 | 乳化沥青设备_改性沥青设备_沥青加温罐_德州市昊通路桥工程有限公司 | 北京森语科技有限公司-模型制作专家-展览展示-沙盘模型设计制作-多媒体模型软硬件开发-三维地理信息交互沙盘 | led太阳能路灯厂家价格_风光互补庭院灯_农村市政工程路灯-中山华可路灯品牌 | 淬火设备-钎焊机-熔炼炉-中频炉-锻造炉-感应加热电源-退火机-热处理设备-优造节能 | 非标压力容器_碳钢储罐_不锈钢_搪玻璃反应釜厂家-山东首丰智能环保装备有限公司 | 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | TMT观察网_独特视角观察TMT行业| 泥沙分离_泥沙分离设备_泥砂分离机_洛阳隆中重工机械有限公司 | 金属清洗剂,防锈油,切削液,磨削液-青岛朗力防锈材料有限公司 | 尾轮组_头轮组_矿用刮板_厢式刮板机_铸石刮板机厂家-双驰机械 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 深圳货架厂家_金丽声精品货架_广东金丽声展示设备有限公司官网 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 传动滚筒_厂家-淄博海恒机械制造厂| 骁龙云呼电销防封号系统-axb电销平台-外呼稳定『免费试用』 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 | 武汉高温老化房,恒温恒湿试验箱,冷热冲击试验箱-武汉安德信检测设备有限公司 | 金刚网,金刚网窗纱,不锈钢网,金刚网厂家- 河北萨邦丝网制品有限公司 | 钢格栅板_钢格板网_格栅板-做专业的热镀锌钢格栅板厂家-安平县迎瑞丝网制造有限公司 | 奇酷教育-Python培训|UI培训|WEB大前端培训|Unity3D培训|HTML5培训|人工智能培训|JAVA开发的教育品牌 | 硬度计,金相磨抛机_厂家-莱州华煜众信试验仪器有限公司 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 隔离变压器-伺服变压器--输入输出电抗器-深圳市德而沃电气有限公司 | 泥沙分离_泥沙分离设备_泥砂分离机_洛阳隆中重工机械有限公司 | 立式硫化罐-劳保用品硫化罐-厂家直销-山东鑫泰鑫硫化罐厂家 | 合肥风管加工厂-安徽螺旋/不锈钢风管-通风管道加工厂家-安徽风之范 | UV-1800紫外光度计-紫外可见光度计厂家-翱艺仪器(上海)有限公司 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 安平县鑫川金属丝网制品有限公司,防风抑尘网,单峰防风抑尘,不锈钢防风抑尘网,铝板防风抑尘网,镀铝锌防风抑尘网 | 恒温水槽与水浴锅-上海熙浩实业有限公司 | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | 提升海外网站流量,增加国外网站访客UV,定制海外IP-访客王 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 |