日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

依赖注入IOC

發布時間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 依赖注入IOC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

要了解控制反轉( Inversion of Control ), 我覺得有必要先了解軟件設計的一個重要思想:依賴倒置原則(Dependency Inversion Principle )

什么是依賴倒置原則?假設我們設計一輛汽車:先設計輪子,然后根據輪子大小設計底盤,接著根據底盤設計車身,最后根據車身設計好整個汽車。這里就出現了一個“依賴”關系:汽車依賴車身,車身依賴底盤,底盤依賴輪子。

這樣的設計看起來沒問題,但是可維護性卻很低。假設設計完工之后,上司卻突然說根據市場需求的變動,要我們把車子的輪子設計都改大一碼。這下我們就蛋疼了:因為我們是根據輪子的尺寸設計的底盤,輪子的尺寸一改,底盤的設計就得修改;同樣因為我們是根據底盤設計的車身,那么車身也得改,同理汽車設計也得改——整個設計幾乎都得改!

我們現在換一種思路。我們先設計汽車的大概樣子,然后根據汽車的樣子來設計車身,根據車身來設計底盤,最后根據底盤來設計輪子。這時候,依賴關系就倒置過來了:輪子依賴底盤, 底盤依賴車身, 車身依賴汽車。

這時候,上司再說要改動輪子的設計,我們就只需要改動輪子的設計,而不需要動底盤,車身,汽車的設計了。

這就是依賴倒置原則——把原本的高層建筑依賴底層建筑“倒置”過來,變成底層建筑依賴高層建筑。高層建筑決定需要什么,底層去實現這樣的需求,但是高層并不用管底層是怎么實現的。這樣就不會出現前面的“牽一發動全身”的情況。

控制反轉(Inversion of Control) 就是依賴倒置原則的一種代碼設計的思路。具體采用的方法就是所謂的依賴注入(Dependency Injection)。其實這些概念初次接觸都會感到云里霧里的。說穿了,這幾種概念的關系大概如下:

為了理解這幾個概念,我們還是用上面汽車的例子。只不過這次換成代碼。我們先定義四個Class,車,車身,底盤,輪胎。然后初始化這輛車,最后跑這輛車。代碼結構如下:

這樣,就相當于上面第一個例子,上層建筑依賴下層建筑——每一個類的構造函數都直接調用了底層代碼的構造函數。假設我們需要改動一下輪胎(Tire)類,把它的尺寸變成動態的,而不是一直都是30。我們需要這樣改:

由于我們修改了輪胎的定義,為了讓整個程序正常運行,我們需要做以下改動:

由此我們可以看到,僅僅是為了修改輪胎的構造函數,這種設計卻需要修改整個上層所有類的構造函數!在軟件工程中,這樣的設計幾乎是不可維護的——在實際工程項目中,有的類可能會是幾千個類的底層,如果每次修改這個類,我們都要修改所有以它作為依賴的類,那軟件的維護成本就太高了。

所以我們需要進行控制反轉(IoC),及上層控制下層,而不是下層控制著上層。我們用依賴注入(Dependency Injection)這種方式來實現控制反轉。所謂依賴注入,就是把底層類作為參數傳入上層類,實現上層類對下層類的“控制”。這里我們用構造方法傳遞的依賴注入方式重新寫車類的定義:

這里我們再把輪胎尺寸變成動態的,同樣為了讓整個系統順利運行,我們需要做如下修改:

看到沒?這里我只需要修改輪胎類就行了,不用修改其他任何上層類。這顯然是更容易維護的代碼。不僅如此,在實際的工程中,這種設計模式還有利于不同組的協同合作和單元測試:比如開發這四個類的分別是四個不同的組,那么只要定義好了接口,四個不同的組可以同時進行開發而不相互受限制;而對于單元測試,如果我們要寫Car類的單元測試,就只需要Mock一下Framework類傳入Car就行了,而不用把Framework, Bottom, Tire全部new一遍再來構造Car。

這里我們是采用的構造函數傳入的方式進行的依賴注入。其實還有另外兩種方法:Setter傳遞接口傳遞。這里就不多講了,核心思路都是一樣的,都是為了實現控制反轉

?

看到這里你應該能理解什么控制反轉和依賴注入了。那什么是控制反轉容器(IoC Container)呢?其實上面的例子中,對車類進行初始化的那段代碼發生的地方,就是控制反轉容器。

顯然你也應該觀察到了,因為采用了依賴注入,在初始化的過程中就不可避免的會寫大量的new。這里IoC容器就解決了這個問題。這個容器可以自動對你的代碼進行初始化,你只需要維護一個Configuration(可以是xml可以是一段代碼),而不用每次初始化一輛車都要親手去寫那一大段初始化的代碼。這是引入IoC Container的第一個好處。

IoC Container的第二個好處是:我們在創建實例的時候不需要了解其中的細節。在上面的例子中,我們自己手動創建一個車instance時候,是從底層往上層new的:

這個過程中,我們需要了解整個Car/Framework/Bottom/Tire類構造函數是怎么定義的,才能一步一步new/注入。

而IoC Container在進行這個工作的時候是反過來的,它先從最上層開始往下找依賴關系,到達最底層之后再往上一步一步new(有點像深度優先遍歷):

這里IoC Container可以直接隱藏具體的創建實例的細節,在我們來看它就像一個工廠:

我們就像是工廠的客戶。我們只需要向工廠請求一個Car實例,然后它就給我們按照Config創建了一個Car實例。我們完全不用管這個Car實例是怎么一步一步被創建出來。

實際項目中,有的Service Class可能是十年前寫的,有幾百個類作為它的底層。假設我們新寫的一個API需要實例化這個Service,我們總不可能回頭去搞清楚這幾百個類的構造函數吧?IoC Container的這個特性就很完美的解決了這類問題——因為這個架構要求你在寫class的時候需要寫相應的Config文件,所以你要初始化很久以前的Service類的時候,前人都已經寫好了Config文件,你直接在需要用的地方注入這個Service就可以了。這大大增加了項目的可維護性且降低了開發難度。

這里只是很粗略的講了一下我自己對IoC和DI的理解。主要的目的是在于最大限度避免晦澀難懂的專業詞匯,用盡量簡潔,通俗,直觀的例子來解釋這些概念。如果讓大家能有一個類似“哦!原來就是這么個玩意嘛!”的印象,我覺得就OK了。想要深入了解的話,可以上網查閱一些更權威的資料。這里推薦一下 Dependency injection 和 Inversion of Control Containers and the Dependency Injection pattern 這兩篇文章,講的很好很詳細。

總結

以上是生活随笔為你收集整理的依赖注入IOC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区二区三区在线看 | 自拍偷拍第五页 | 人人爽久久涩噜噜噜网站 | 好男人资源 | 玖草视频在线观看 | 人人妻人人玩人人澡人人爽 | 国产福利一区二区三区在线观看 | 一区精品视频在线观看 | 奶罩不戴乳罩邻居hd播放 | 在线免费观看不卡av | 福利小视频在线播放 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲欧美日韩中文在线 | 在线观看国产免费视频 | 婷婷狠狠爱| 日本人妻一区 | 午夜伦情 | 日韩和欧美一区二区 | 欧美夜夜骑 | 一区二区三区中文字幕在线观看 | 欧美日本二区 | 久久久国产精品黄毛片 | 黄色片怎么看 | 91a视频| 538国产精品一区二区 | 91影院在线观看 | 26uuu亚洲国产精品 | 手机在线看片国产 | 香蕉网站在线观看 | 亚洲 欧美 日韩 国产综合 在线 | 久久调教| 刘亦菲一区二区三区免费看 | 色婷婷在线观看视频 | 插插插色综合 | 6080亚洲精品一区二区 | xxxx视频在线观看 | 在线中文字幕一区二区 | 日本毛片在线看 | 丰满熟女人妻一区二区三区 | 亚洲成人自拍偷拍 | 丁香花电影在线观看免费高清 | 搞中出 | 一进一出好爽视频 | 国产不卡视频一区二区三区 | 欧美日韩xxxx | 女同性做受全过程动图 | 欧美 日韩 国产 成人 在线 91 | 亚洲激情在线观看视频 | 日日日日日日bbbbbb | 亚洲乱码国产乱码精品天美传媒 | 最新中文字幕在线播放 | 热播之家 | 成人久久久久久久 | 在线观看中文字幕av | 深夜福利在线免费观看 | 日韩精品字幕 | 熟妇人妻无码xxx视频 | 国产中文字幕乱人伦在线观看 | 日本美女黄色 | 久久国产色 | 欧美一区二区人人喊爽 | 日韩一区二区高清视频 | 亚洲网站视频 | 欧美极度另类 | 天天综合av| 国精产品一区一区三区 | 黄色片网站在线观看 | 成人超碰| 国产一区二区三区四区五区在线 | 精品午夜一区二区 | 亚洲爽妇网| 中文字幕手机在线视频 | 婷婷丁香九月 | 日韩人妻一区二区三区蜜桃 | 免费福利在线视频 | 亚洲熟妇无码一区二区三区导航 | 999热视频 | 老外一级片 | 97成人人妻一区二区三区 | 最新日韩三级 | 欧美精品一区二区在线观看 | 久久羞羞 | 国产在线色视频 | 丝袜在线一区 | 国产黄色一级网站 | 青青国产精品 | 亚洲天堂毛片 | 国产精品wwww | 亚洲精品一二三四 | www.4hu95.com四虎 极品在线视频 | 男操女免费网站 | 国产日产久久高清欧美一区 | 国产精品自拍合集 | 三上悠亚一区二区 | 日韩av成人在线 | bt天堂新版中文在线地址 | xxxxⅹxxxhd日本8hd | 好爽快一点高潮了 | 色偷偷免费费视频在线 |