Spring依賴注入



每個基於Java的應用程式都有一些物件協同工作,以呈現終端使用者看到的可用應用程式。在編寫複雜的Java應用程式時,應用程式類應該儘可能獨立於其他Java類,以增加重用這些類的可能性,並在單元測試中獨立於其他類測試它們。依賴注入(有時稱為連線)有助於將這些類粘合在一起,同時保持它們的獨立性。

假設您有一個包含文字編輯器元件的應用程式,並且您想提供拼寫檢查功能。您的標準程式碼如下所示:

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor() {
      spellChecker = new SpellChecker();
   }
}

我們在這裡所做的是,在TextEditor和SpellChecker之間建立依賴關係。在控制反轉方案中,我們將改為執行以下操作:

public class TextEditor {
   private SpellChecker spellChecker;
   
   public TextEditor(SpellChecker spellChecker) {
      this.spellChecker = spellChecker;
   }
}

在這裡,TextEditor不必擔心SpellChecker的實現。SpellChecker將獨立實現,並在TextEditor例項化時提供給TextEditor。整個過程由Spring框架控制。

在這裡,我們移除了TextEditor的全部控制權,並將其放在其他地方(即XML配置檔案),並且依賴項(即類SpellChecker)透過**類構造器**注入到類TextEditor中。因此,控制流已透過依賴注入 (DI)“反轉”,因為您已有效地將依賴項委託給某個外部系統。

注入依賴關係的第二種方法是透過TextEditor類的**Setter方法**,我們將在其中建立一個SpellChecker例項。此例項將用於呼叫setter方法來初始化TextEditor的屬性。

因此,DI存在兩種主要變體,接下來的兩個子章節將分別用示例介紹它們:

序號 依賴注入型別和描述
1

基於構造器的依賴注入

當容器呼叫具有多個引數的類構造器時,每個引數都代表對其他類的依賴關係,則完成基於構造器的DI。

2

基於Setter的依賴注入

基於Setter的DI是透過容器在呼叫無引數構造器或無引數靜態工廠方法來例項化bean之後呼叫bean上的setter方法來實現的。

您可以混合使用基於構造器和基於Setter的DI,但一個好的經驗法則是對強制依賴項使用構造器引數,對可選依賴項使用setter。

使用DI原則,程式碼更簡潔,當向物件提供其依賴項時,解耦更有效。物件不查詢其依賴項,也不瞭解依賴項的位置或類,而是Spring框架處理所有這些。

基於構造器與基於Setter的依賴注入。

基於構造器和基於Setter的依賴注入之間存在一些值得注意的差異。

  • **粒度控制** - 如果構造器接受多個值,則需要在bean配置期間傳遞所有值,而在setter的情況下,可以在特定setter方法中傳遞值,並且可以保留其他setter未配置。

  • **Setter覆蓋構造器** - 如果同時使用基於構造器和基於setter的注入,則基於setter的注入優先。

  • **靈活性** - Setter方法不像構造器那樣建立新的bean例項,它們的值也可以更改。

廣告
© . All rights reserved.