天天看點

「Spring認證」Spring 依賴注入

每個基于 Java 的應用程式都有一些對象,它們協同工作以呈現最終使用者所看到的工作應用程式。在編寫複雜的 Java 應用程式時,應用程式類應盡可能獨立于其他 Java 類,以增加重用這些類的可能性,并在單元測試時獨立于其他類進行測試。依賴注入(或有時稱為連接配接)有助于将這些類粘合在一起,同時保持它們的獨立性。

假設您有一個具有文本編輯器元件的應用程式,并且您想要提供拼寫檢查。你的标準代碼看起來像這樣 -

public class TextEditor {

private SpellChecker spellChecker;

public TextEditor() {

spellChecker = new SpellChecker();           

}

我們在這裡所做的是,在 TextEditor 和 SpellChecker 之間建立一個依賴項。在控制反轉的情況下,我們會做這樣的事情 -

public TextEditor(SpellChecker spellChecker) {

this.spellChecker = spellChecker;           

在這裡,TextEditor 不應該擔心 SpellChecker 的實作。SpellChecker 将獨立實作,并在 TextEditor 執行個體化時提供給 TextEditor。整個過程由 Spring 架構控制。

在這裡,我們從 TextEditor 中删除了完全控制權并将其保留在其他地方(即 XML 配置檔案),并且依賴項(即類 SpellChecker)通過Class Constructor注入到類 TextEditor 中。是以,控制流已被依賴注入(DI)“反轉”,因為您已經有效地将依賴委托給了某個外部系統。

注入依賴項的第二種方法是通過TextEditor 類的Setter 方法,我們将在其中建立 SpellChecker 執行個體。此執行個體将用于調用 setter 方法來初始化 TextEditor 的屬性。

是以,DI 存在于兩個主要變體中,以下兩個子章節将通過示例涵蓋它們 -

不。 依賴注入類型和描述

1 基于構造函數的依賴注入

當容器調用帶有多個參數的類構造函數時,基于構造函數的 DI 就完成了,每個參數代表對另一個類的依賴。

2 基于 Setter 的依賴注入

基于 Setter 的 DI 是通過容器在調用無參數構造函數或無參數靜态工廠方法來執行個體化 bean 後調用 bean 上的 setter 方法來完成的。

您可以混合使用基于 Constructor 和 Setter 的 DI,但使用構造函數參數作為強制依賴項和 setter 作為可選依賴項是一個很好的經驗法則。

使用 DI 原則,代碼更清晰,當對象提供依賴項時,解耦更有效。該對象不查找其依賴項,也不知道依賴項的位置或類,而是由 Spring 架構處理所有事情。