1. 程式人生 > 程式設計 >Spring 依賴注入實現示例

Spring 依賴注入實現示例

【注】本文譯自:https://springframework.guru/...

  在本文中,我將向你展示如何在 Spring Framework 的依賴項注入中使用 Project Lombok 以獲得最佳實踐。
  Spring 框架本身具有多種執行依賴項注入的方式。選項的靈活性是 Spring 框架的優勢。但是,並非所有的依賴項注入選項都被視為最佳實踐。有些實際上不太好。

依賴注入示例

  我提供了一些設定示例,供我們檢視必須使用的各種依賴項注入選項。
  讓我們以 Spring Service 為例。就我們的目的而言,該服務具有一種返回字串的方法。我們將使用“service”,並使用 Spring將其注入一些模擬控制器中。請記住,我們只是在探索如何使用 Spring Framework 進行依賴項注入。

示例 Service

public class MyService {
  public String getHello(){
    return "Hello";
  }
}

 我們的 Field 擁有一項公有屬性的服務。我們可以註解該欄位,Spring 將注入該服務的例項。

屬性注入

Field Controller

@Controller
public class FieldController {
  @Autowired
  MyService myService;
  public String saySomething(){
    return myService.getHello();
  }
}

  這只是一個公有屬性,沒有 setter。顯然,這不是一個好的實踐,不推薦這樣做。
  我們可以對此進行一些改進,將該欄位的訪問許可權設為私有。Spring Framework 確實允許你自動裝配私有欄位。你確實看到有人這樣做。Spring 將執行一些反射魔術來執行依賴項注入

私有 Field Controller

public class PrivateFieldController {
  @Autowired
  private MyService myService;
  public String saySomething(){
    return myService.getHello();
  }
}

  儘管只使用私有欄位比較好,但是測試卻成了一個令人頭痛。你要麼需要啟動 Spring Context,要麼使用一些 Spring 實用程式來執行依賴注入以進行測試。不是世界末日,但總的來說很煩人。
  我們可以通過為私有屬性提供 setter 來改善這一點。Getter 和 Setter 通常被認為是面向物件程式設計中的最佳實踐。通過註解 setter 方法,指示 Spring 使用 setter 進行依賴項注入很簡單。

方法注入

Setter Controller

@Controller
public class SetterController {
  private MyService myService;
  @Autowired
  public void setMyService(MyService myService) {
    this.myService = myService;
  }
  public String saySomething(){
    return myService.getHello();
  }
}

  這是使用私有欄位時的明顯改進。有人會抱怨這要寫太多程式碼。但是實際上,自 South Park 的第一季以來,此類任務已在現代 IDE 中實現了自動化。

建構函式注入

  下一個選項是使用建構函式。到目前為止,這是我們研究過的最佳方法。 使用建構函式設定注入的屬性時,不必提供自動裝配註釋。這是一個很好的功能,可以節省一些鍵入時間。從 Spring Framework 版本4.2開始,用於依賴項注入的建構函式的註釋是可選的。

Constructor Controller

@Controller
public class ConstructorController {
  private MyService myService;
  public ConstructorController(MyService myService) {
    this.myService = myService;
  }
  public String saySomething(){
    return myService.getHello();
  }
}

  基於建構函式的依賴注入無疑被認為是最佳實踐。曾經有一段時間我個人偏愛基於 setter 的注入,但是後來又轉向基於建構函式的注入。
  我們仍然可以改善我們的示例。現在有兩個主要問題。 第一,我們的服務型別是具體型別。硬型別的依賴注入不是最佳實踐。
  第二個問題是,我們要注入的屬性未宣告為final。因此,從理論上講,該類可以在例項化注入的屬性後對其進行修改。依# 賴注入最佳實踐
  依賴項注入的最佳實踐是利用介面,建構函式和 final 屬性。
  我已經設定了“最佳實踐”服務介面,並提供了服務實現---使用了 Spring Service 註解。

最佳實踐服務介面

public interface BpService {
  String getHello();
}

最佳實踐服務實現

@Service
public class BpServiceImpl implements BpService {
  @Override
  public String getHello() {
    return "The Best Hello!";
  }
}

使用 Project Lombok

  現在,使用 Project Lombok 進行依賴注入的最佳實踐的祕訣在於:

  • 宣告一個 final 屬性介面
  • 為類新增 Project Lomboc 註解 @RequiredArgsConstructor

  現在,Project Lombok 將為宣告為 final 的所有屬性生成一個建構函式。Spring 會自動使用 Lombok 提供的建構函式來自動裝配該片段。

Lombok Controller

@RequiredArgsConstructor
@Controller
public class BpFinalConstructorController {
  private final BpService bpService;
  public String saySomething(){
    return bpService.getHello();
  }
}

  這是執行此操作的真正好方法。您的程式碼保持非常乾淨。使用 Spring時,通常需要多個自動裝配屬性。
  當您需要新增另一個 bean 時,只需宣告一個 final 屬性。
  如果您重構並且不再需要 Spring 託管的依賴項,則只需刪除 final 屬性。
  你不再需要維護設定器或建構函式程式碼。Project Lombok 減輕了您的日常工作。
  我在日常編碼中一直使用這種技術。絕對是節省時間。並導致更乾淨的程式碼。未使用的屬性和未使用的建構函式引數已一去不復返了。重構現在不那麼痛苦了!
  本文的原始碼可在GitHub 上找到。

以上就是Spring 依賴注入實現示例的詳細內容,更多關於Spring 依賴注入的資料請關注我們其它相關文章!