1. 程式人生 > >也談Spring之依賴注入DI/控制反轉IOC

也談Spring之依賴注入DI/控制反轉IOC

首先提問, 什麼是 Spring IOC 容器?

        Spring 框架的核心是 Spring 容器。容器建立物件,將它們裝配在一起,配置它們並管理它們的完整生命週期。Spring 容器使用依賴注入來管理組成應用程式的元件。容器通過讀取提供的配置元資料來接收物件進行例項化,配置和組裝的指令。該元資料可以通過 XML,Java 註解或 Java 程式碼提供。

然而,到底什麼是依賴注入?

        在依賴注入中,您不必建立物件,但必須描述如何建立它們。您不是直接在程式碼中將元件和服務連線在一起,而是描述配置檔案中哪些元件需要哪些服務。由 IoC 容器將它們裝配在一起。

那麼,可以通過多少種方式完成依賴注入?

通常,依賴注入可以通過三種方式完成:

  • 建構函式注入

  • setter 注入

  • 介面注入 在 Spring Framework 中,僅使用建構函式和 setter 注入。

注入方式:區分建構函式注入和、setter 注入、自動裝配

建構函式注入 setter 注入
沒有部分注入 有部分注入
不會覆蓋 setter 屬性 會覆蓋 setter 屬性
任意修改都會建立一個新例項 任意修改不會建立一個新例項
適用於設定很多屬性 適用於設定少量屬性

spring 中有多少種 IOC 容器?

  • BeanFactory - BeanFactory 就像一個包含 bean 集合的工廠類。它會在客戶端要求時例項化 bean。

  • ApplicationContext - ApplicationContext 介面擴充套件了 BeanFactory 介面。它在 BeanFactory 基礎上提供了一些額外的功能。

區分 BeanFactory 和 ApplicationContext。

BeanFactory ApplicationContext
它使用懶載入 它使用即時載入
它使用語法顯式提供資源物件 它自己建立和管理資源物件
不支援國際化 支援國際化
不支援基於依賴的註解 支援基於依賴的註解

列舉 IoC 的一些好處。

IoC 的一些好處是:

  • 它將最小化應用程式中的程式碼量。

  • 它將使您的應用程式易於測試,因為它不需要單元測試用例中的任何單例或 JNDI 查詢機制。

  • 它以最小的影響和最少的侵入機制促進鬆耦合。

  • 它支援即時的例項化和延遲載入服務。

Spring IoC 的實現機制。

Spring 中的 IoC 的實現原理就是工廠模式加反射機制。

示例:

interface Fruit {
     public abstract void eat();
}
class Apple implements Fruit {
    public void eat(){
        System.out.println("Apple");
    }
}
class Orange implements Fruit {
    public void eat(){
        System.out.println("Orange");
    }
}
class Factory {
    public static Fruit getInstance(String ClassName) {
        Fruit f=null;
        try {
            f=(Fruit)Class.forName(ClassName).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return f;
    }
}
class Client {
    public static void main(String[] a) {
        Fruit f=Factory.getInstance("io.github.dunwu.spring.Apple");
        if(f!=null){
            f.eat();
        }
    }
}