你真的思考過IOC容器嗎?

你真的思考過IOC容器嗎?

來自專欄猿論16 人贊了文章

Ioc概念

很多初學者在剛聽到Ioc和DI等概念的時候,往往一頭霧水,用了很久才理解它們的意思,這裡我說一下我對它們的理解。

IOC(Inversion Of Control,反轉控制)一般也被理解為DI(Dependency Injection,依賴注入),實際上兩者還是略微有些區別,雖然它們經常性的出現在一起。

Ioc是把對象的控制權較給框架或容器,容器中存儲了眾多我們需要的對象,然後我們就無需再手動的在代碼中創建對象。需要什麼對象就直接告訴容器我們需要什麼對象,容器會把對象根據一定的方式注入到我們的代碼中。注入的過程被稱為DI。有時候需要動態的指定我們需要什麼對象,這個時候要讓容器在眾多對象中去尋找,容器尋找需要對象的過程,稱為DL(Dependency Lookup, 依賴查找)。

按照上面的理解,那麼IOC包含了DI與DL,並且多了對象註冊的過程。

Ioc是一種設計模式,一種概念,主要包含的內容如下:

  • 對象的生命周期的管理
  • 依賴的解析與注入
  • 依賴的查詢
  • 應用的配置

Ioc的優點

IOC容器給我們提供的最大便利之處就是更容易實現可插拔,可替換的組件。這也是介面驅動開發所帶來的優勢,根據介面可以提供更多靈活的子類實現,增強代碼的健壯性和穩定性。

Ioc管理的組件一般是實現了某些介面的類,這些組件又會使用其它的實現某些介面的組件,它們都不需要知道介面的具體實現,因為這,組件間的替換才會如此容易。容器的任務就是幫我們創建組件的具體事例,並且把管理它們的依賴關係,把所需的具體依賴傳給組件。

一個有關Ioc的案例

市場上實現Ioc的容器有多種:像Guice, Spring, Jboss等。

我們使用Spring來做一個案例:

  1. 首先下載Spring的lib,添加Jar包依賴
  2. 寫測試程序

// HelloWorld介面與它的實現public interface HelloWord { void sayHello();}public class HelloWordImpl1 implements HelloWord { @Override public void sayHello() { System.out.println("hello1"); }}public class HelloWordImpl2 implements HelloWord { @Override public void sayHello() { System.out.println("hello2"); }}

  1. 新建Spring配置文件,Spring的配置可以試Java配置,也可以是xml配置,我們使用Java配置。

@Configurationpublic class BeanConfig { @Bean public HelloWord helloWord(){ //我們可以在此處創建HelloWorld的實現,在注入的時候直接指定相應的類就好了 return new HelloWordImpl1(); }}

  1. 運行程序

public class App { public static void main(String[] args) { ApplicationContext applicationContext = new AnnotationConfigApplicationContext("me.aihe"); HelloWord helloWord = applicationContext.getBean(HelloWord.class); helloWord.sayHello(); }}// 運行結果hello1//當修改BeanConfig的返回HelloWorld的Bean為HelloWorldImp2時//運行結果為hello2

以上是一個簡單案例,但是可以稍微由此得出一些Ioc的有點:

  1. 在應用代碼中,我們無需使用new關鍵字新建對象。在業務代碼中太多的new對象會導致代碼耦合度過高。
  2. 應用中只需要使用HelloWorld的介面,不用關心HelloWorld介面的實現。我們只是告訴ApplicationContext,我們需要HelloWorld類型的對象,然後就獲得了一個對象。

對象關係圖:

應用無需關心組件,只需要從容器中拿。

小結

這裡我們提到了Ioc的概念,控制反轉,對象控制權由對象本身轉向容器;依賴注入,容器管理組件的依賴關係並提供對應的依賴對象。然後說了IOC的優點:

  • 減少代碼的耦合,可以使應用更加模塊化
  • 增加代碼的復用率
  • 資源更加統一管理
  • 維護代碼更加方便,一般只需要修改一下配置文件就ok了。
  • 提升了程序的測試性

這裡僅僅是個人對IOC的理解,如果想要有更深入的理解,可以查閱更加權威的書籍與資料。

參考

  • 控制反轉
  • Ioc有什麼好處呢

作者:艾賀521

鏈接:imooc.com/article/35099

來源:慕課網

本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作


推薦閱讀:

【重磅】認證作者招募 | 打造個人品牌 so easy !

js代碼常見技巧總結

so easy 前端簡單實現多語言

在騰訊實習一年,我學到了什麼

程序員偷偷深愛的 9 個不良編程習慣


推薦閱讀:

語法分析技術簡介
學長學姐說||在麻省埃莫斯特分校讀CS是怎樣一種體驗?
1-22 第一部分的結語
網路基本功(十三):細說Linux網路配置(下)
如何開啟MySQL慢查詢日誌

TAG:計算機科學 | 編程 | IOC |