中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java的DI依賴注入示例分析

發布時間:2022-02-28 10:32:11 來源:億速云 閱讀:142 作者:iii 欄目:開發技術

本篇內容主要講解“Java的DI依賴注入示例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java的DI依賴注入示例分析”吧!

依賴注入 (DI) 是一種讓類從外部接收其依賴的技術。如果類 A 使用類 B,則類 A 依賴于類 B,而 B 是 A 的依賴項。

以下示例顯示了 Java 中的依賴項和 DI 是什么。在第一個示例中,A 類依賴于 B 類,因為 B 是 A 的成員。A 和 B 是緊密耦合的。每當 B 改變時,A 就必須改變。這種情況稱為硬依賴。

// hard dependency
class A{
    private B b;
 
    public A(){
        this.b = new B();
    }
 
    ...
}

在第二個例子中,A 仍然依賴于 B,但依賴不是硬編碼的。它通過在構造函數中使用參數來解耦。如果 A 需要 B 的不同實現,A 可以使用 B 的不同實現來構造實例。這導致了 DI 的一個關鍵特性:被注入的類應該是一個抽象接口,以便可以將不同的實現注入到 A。如果 B 的實現只有一個,則不需要進行 DI。

// dependency injection through constructor
class A{
    private B b;
 
    public A(B b){
        this.b = b;
    }
 
    ...
}

使用依賴注入的好處

DI 的一個示例用途是數據訪問對象 (DAO)。執行 CRUD 操作的類通常需要訪問數據庫。使用 DI 向應用程序注入 DAO 將應用程序層與數據持久層解耦。如果底層數據庫發生變化,只要這些 DAO 實現相同的接口,應用程序類就可以更改為不同的 DAO。另一個好處是使單元測試更容易。單元測試可以使用偽造的(硬編碼或內存中的)DAO 來測試應用程序邏輯,而無需擔心底層數據庫訪問。

DI 是流行的 Java 框架(如 Spring 和 Hibernate)中使用的一項關鍵技術。框架不是手動創建 B 對象并將其傳遞給 A 的構造函數,而是使用反射來創建依賴對象并根據配置將它們注入到適當的位置。

一個展示依賴注入的簡單例子

下面是一個簡單的例子來說明使用框架時 DI 的樣子以及使用 DI 的兩個好處。我使用 Guice 框架,但其他框架在幕后以相同的方式工作。

假設我們有一臺計算機,它有很多部分協同工作,例如 CPU、內存等。 CPU 中有兩種方法。

public interface CPU {
    public void start();
    public int getUsage();
}

CPU 可以是 Intel,

public class Intel implements CPU{
    @Override
    public void start() {
        System.out.println("Intel is started.");
    }
 
    @Override
    public int getUsage() {
        return new Random().nextInt(100);
    }
}

或 AMD。

public class Amd implements CPU {
    @Override
    public void start() {
        System.out.print("Amd is started");
    }
 
    @Override
    public int getUsage() {
        return new Random().nextInt(100);
    }
}

在 Guice 中,通過構造函數注入依賴就像添加 @Inject 注釋一樣簡單。

public class Computer {
    private CPU cpu;
 
    @Inject
    Computer(CPU cpu) {
        this.cpu = cpu;
    }
 
    public void start() {
        cpu.start();
        // start other parts
    }
 
    public boolean isStatusOk() {
        //assuming this random
        if (cpu.getUsage() > 50) {
            return false;
        }
 
        // check other things, such as memory, hard drives.
 
        return true;
    }
 
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new BasicModule());
        Computer computer = injector.getInstance(Computer.class);
        computer.start();
        System.out.println("Status:" + (computer.isStatusOk() ? "OK" : "Not OK"));
    }
}

Guice 使用模塊來配置注入。在此示例中,當請求 CPU 時,模塊將具體的 Intel 綁定到 CPU。

public class BasicModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(CPU.class).to(Intel.class);
    }
}

這樣做的好處是顯而易見的。計算機可以在需要時靈活地使用其他類型的 CPU。此外,如果 CPU 依賴于另一個類,例如 Cache 或 Clock,我們可以使用相同的方式注入依賴項,而無需耦合這些類。

關于第二個好處——讓單元測試更簡單,我們可以做一個簡單的單元測試來測試 isStatusOk() 方法。在實際情況下,CPU 使用率可以是基于實際使用情況的隨機數。如果我們想把測試的重點放在方法的其他部分,我們可以模擬 CPU 的使用情況,假設 CPU 使用率沒問題,然后測試其他部分。

public class ComputerTest {
    @Test
    public void testIsStatusOk(){
        CPU cpu = mock(CPU.class);
        // mock cpu usage, so we can focus on testing other part
        when(cpu.getUsage()).thenReturn(10);
        assertTrue(new Computer(cpu).isStatusOk());
    }
}

總之,DI 是為了分離對象創建和使用的關注點。DI 解耦類依賴并使單元測試更容易。

到此,相信大家對“Java的DI依賴注入示例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

类乌齐县| 女性| 丹东市| 启东市| 麟游县| 河间市| 福建省| 东乌珠穆沁旗| 宁南县| 布拖县| 五莲县| 延津县| 梨树县| 南华县| 兴山县| 徐水县| 那曲县| 昌平区| 虞城县| 南涧| 阳信县| 兰州市| 临高县| 南皮县| 阿拉善左旗| 陆良县| 固原市| 壶关县| 林口县| 三明市| 黄浦区| 阜宁县| 山阴县| 华阴市| 来凤县| 遂川县| 抚顺县| 若尔盖县| 衡阳县| 长垣县| 城市|