簡體   English   中英

我真的需要在 Spring 中創建接口嗎?

[英]Do I really need to create interfaces in Spring?

在我的 Spring 項目中,我有許多簡單的服務來獲取數據(只是一個簡單的 CRUD)。 啟動這個項目的開發人員的設計是為每個服務創建實現,比如

public interface UserService

然后實現像

public class UserServiceImpl implements UserService

由於UserService不可能有更多的實現,我真的厭倦了這些Impl后綴,而且我讀得越多(例如這篇文章),我意識到我有理由生病

上周我與一個團隊的朋友進行了討論,我與他分享了我的想法,但他的回答是“基本上你是對的,但 Spring 喜歡接口並且比類更喜歡與它們一起工作”。

不幸的是,我不是 Spring 的專家,但是我試圖尋找一些論據,我無法找到答案,他是對的。

在 Spring 中使用這種方法來為每個小服務類提供接口是否有一些強有力的論據?

我可以從現實世界的項目中看出,它在沒有接口的情況下運行良好,只有實現類。 遵循“您不需要它”( YAGNI )的原則,如果您遵循該規則,則可以簡化您的代碼。 依賴注入也適用於類,接口不是它的必要條件。

當然,您可以編寫和重用測試實現,但是您可以對模擬執行相同的操作,例如使用mockito並覆蓋測試用例的實現類的行為。

無論您想在何處獲得依賴注入 (DI) 模式的好處,您都需要針對抽象(通常是接口)進行編程。

DI 有更多好處,但最有說服力的似乎是它允許單元測試。 在那里您的接口將至少獲得一個更多的實現(模擬實現),當您想要獨立於其依賴項(接口的那些生產實現)來測試您的類時。

也就是說,這並不意味着每個類都必須實現某個接口。 代碼的某些部分可以毫無問題地緊密耦合在一起。

請注意,是否使用 Spring 對使用 DI/不使用 DI 的決定沒有影響。

這不是必須的,也可能是基於意見的,但您正在添加界面以實現未來的服務靈活性,

盡管您沒有看到真正的用法,但它允許您在單元/集成測試中使用特定服務的不同實現

您可以添加測試實現而不是當前實現,並在執行測試時使用它代替實際服務(例如,通過使用不同的 Spring 配置文件)

正如@Simulant 指出的那樣,這可以使用模擬來完成

實際上不需要,目前,微服務或迷你代碼庫很流行。 所以通常情況下,在 rest api 后端,您真的沒有機會為某些接口實現多個實現。 在這種情況下,使用@Serivice 的具體類就足夠了。

我已經瀏覽了這里的所有答案,但想在代理上添加更多內容

AOP 可以使用 JDK 代理或 CGlib 代理

如果 Class 已經實現了接口,它將使用 JDK 代理(只要你有選擇,就首選)。 如果 Class 沒有實現接口,它將使用 CGlib 代理。

正如其他人所建議的那樣,這實際上取決於用例。 盡管 Spring 和 Java 通常開始是一種冗長的語言,其設計中的接口假設充當客戶端、實現類可以看到的內容,但我發現這些天來越來越少的冗長代碼,尤其是。 現在使用 Spring Boot 和 lombok 等庫。

因此,為服務、DAO 創建接口不是強制性的,但如果您正在處理相當中等的代碼庫,其中有多個開發人員和可能的客戶端也在應用程序之外使用這些 API,則首選。 但是,如果您正在為一個小型或概念驗證項目工作,您也可以在一個 Java 類上創建一個 CRUD 應用程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM