天天看點

Ioc容器概述

Ioc概念

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

Ioc容器概述

image.png

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配置。
@Configuration
public 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的概念,控制反轉,對象控制權由對象本身轉向容器;依賴注入,容器管理元件的依賴關系并提供對應的依賴對象。然後說了IOC的優點:

  • 減少代碼的耦合,可以使應用更加子產品化
  • 增加代碼的複用率
  • 資源更加統一管理
  • 維護代碼更加友善,一般隻需要修改一下配置檔案就ok了。
  • 提升了程式的測試性

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

參考