最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀為什么@Autowired在屬性上被警告,在setter方法上不被警告問題

 更新時間:2025年02月28日 11:04:45   作者:drebander  
在Spring開發(fā)中,@Autowired注解常用于實現(xiàn)依賴注入,它可以應用于類的屬性、構造器或setter方法上,然而,當@Autowired注解在屬性上使用時,IntelliJIDEA等IDE會給出Fieldinjectionisnotrecommended的警告,而在setter方法上使用@Autowired時卻不會出現(xiàn)這個警告

在 Spring 開發(fā)中,@Autowired 注解常用于實現(xiàn)依賴注入。它可以應用于類的 屬性、構造器setter 方法 上。然而,當 @Autowired 注解在 屬性 上使用時,IntelliJ IDEA 等 IDE 會給出 Field injection is not recommended 的警告,而在 setter 方法 上使用 @Autowired 時卻不會出現(xiàn)這個警告。

1. 為什么 @Autowired 在屬性上被警告?

1.1 隱式依賴注入

@Autowired 注解應用于類的 屬性 上時,Spring 會直接注入該屬性,而不通過構造函數(shù)或 setter 方法顯式地傳遞依賴項。

這種注入方式稱為 字段注入(Field Injection)。

字段注入 的缺點主要體現(xiàn)在以下幾個方面:

1.隱式依賴

  • 通過字段注入,類的依賴關系是隱式的,無法在類的構造器或方法中顯式地看到這些依賴。相對而言,構造器注入setter 注入 可以使依賴關系更加明確。
  • 由于字段依賴是隱式注入的,開發(fā)者很難在不查看容器配置的情況下,快速了解一個類的所有依賴項。

2.難以進行單元測試

  • 字段注入的屬性是隱式注入的,無法通過構造函數(shù)或 setter 方法顯式傳遞。在單元測試中,手動注入模擬(mock)對象時,需要通過反射或者測試框架自動注入,這增加了測試的復雜性。
  • 與此相比,構造器注入和 setter 注入會使依賴關系顯式可見,能夠更方便地進行 單元測試。

3.違反依賴倒置原則(DIP)

  • 依賴倒置原則 中,依賴關系應該通過 接口抽象 進行注入,而不應該在類內部直接依賴于具體的實現(xiàn)。
  • 字段注入使得類的依賴更加隱式,可能會增加代碼的耦合性。

1.2 IDE 的警告:Field injection is not recommended

IntelliJ IDEA 等 IDE 會根據(jù)這些設計缺點發(fā)出警告,提示 @Autowired 注解不推薦使用在屬性上。

字段注入的方式可能會導致代碼的可維護性差,容易出現(xiàn)一些潛在問題(如不清晰的依賴關系和難以測試的代碼)。

2. 為什么 @Autowired 在 setter 方法上不被警告?

@Autowired 用于 setter 方法 時,Spring 會通過 setter 注入 方式將依賴項注入到對象的屬性中。

與字段注入不同,setter 注入方式具有以下優(yōu)勢:

2.1 顯式依賴注入

顯式依賴關系:使用 setter 方法注入,開發(fā)者可以明確看到類所依賴的組件。通過查看類的 setter 方法,其他開發(fā)者可以輕松理解該類的依賴關系。

public class MyService {
    private MyRepository repository;
    
    @Autowired
    public void setRepository(MyRepository repository) {
        this.repository = repository;
    }
}

符合依賴注入的設計原則:通過構造函數(shù)或 setter 方法注入依賴項,可以使類的依賴關系更加清晰,符合面向對象設計中的 依賴注入單一職責原則。

2.2 可選的依賴注入

setter 注入適用于一些 可選依賴 的場景。如果某個依賴是可選的,可以通過 setter 方法來靈活注入,而不需要在構造器中強制要求依賴項的傳入。

@Autowired
public void setOptionalDependency(Optional<Dependency> dependency) {
    this.dependency = dependency.orElse(null);
}

2.3 易于測試

  • 由于 setter 方法可以手動設置對象的依賴,因此它可以使單元測試變得更簡單。
  • 你可以通過 setter 方法為對象注入模擬(mock)依賴項,而不需要通過反射等復雜手段。
MyService myService = new MyService();
myService.setRepository(mockRepository);

3. 構造器注入 vs 字段注入 vs Setter 注入

3.1 構造器注入(推薦)

構造器注入最推薦的依賴注入方式,它具有以下優(yōu)勢:

  • 強制依賴關系:通過構造器傳遞依賴項,可以確保所有的依賴項在對象創(chuàng)建時就已經(jīng)被正確地注入。
  • 不可變性:構造器注入使得依賴項在對象創(chuàng)建時就被初始化,避免了運行時更改依賴項。
  • 易于測試:構造器注入使得所有的依賴項在構造時就顯式提供,便于進行單元測試。
public class MyService {
    private final MyRepository repository;
    
    @Autowired
    public MyService(MyRepository repository) {
        this.repository = repository;
    }
}

3.2 Setter 注入(次推薦)

Setter 注入 是一個靈活的選擇,適用于依賴關系較為可選或后期可更改的場景。它具有以下特點:

  • 靈活性:可以在對象創(chuàng)建后修改依賴項。
  • 適用于可選依賴:如果某些依賴項是可選的,setter 注入能夠方便地管理。
public class MyService {
    private MyRepository repository;

    @Autowired
    public void setRepository(MyRepository repository) {
        this.repository = repository;
    }
}

3.3 字段注入(不推薦)

字段注入 是最簡單的注入方式,但并不推薦使用,原因已在前面提到。字段注入具有以下缺點:

  • 不清晰的依賴關系:依賴項通過字段注入,難以通過構造器或 setter 明確看到類的依賴。
  • 難以測試:無法通過構造函數(shù)直接注入模擬對象,增加了單元測試的難度。
public class MyService {
    @Autowired
    private MyRepository repository;
}

4. 總結

  • 字段注入不推薦,因為它將依賴關系隱藏在字段中,難以清晰表達依賴項,增加了測試的復雜性。
  • 推薦使用構造器注入,它提供了最強的類型安全性和不可變性,增強了代碼的可維護性和測試性。
  • Setter 注入適用于可選依賴,但在依賴較多時容易導致依賴關系變得模糊,因此需要謹慎使用。

總體而言,使用構造器注入和 setter 注入能夠使代碼更清晰、易于維護,同時支持更好的單元測試。

如果 IDE 提示 Field injection is not recommended,這意味著你可以考慮改用構造器注入或 setter 注入,以便提升代碼質量。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • springboot網(wǎng)站應用使用第三方qq登錄的實現(xiàn)過程

    springboot網(wǎng)站應用使用第三方qq登錄的實現(xiàn)過程

    這篇文章主要介紹了springboot網(wǎng)站應用使用第三方qq登錄,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Spring?Batch實現(xiàn)批量處理

    Spring?Batch實現(xiàn)批量處理

    本文主要介紹了Spring?Batch進行批量處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • Java中TCP通信的實現(xiàn)方法詳解

    Java中TCP通信的實現(xiàn)方法詳解

    這篇文章主要給大家介紹了關于Java中TCP通信的實現(xiàn)方法,TCP通信能實現(xiàn)兩臺計算機之間的數(shù)據(jù)交互,通信的兩端,要嚴格區(qū)分為客戶端(Client)與服務端(Server),需要的朋友可以參考下
    2023-09-09
  • Java必踩的坑之方法中形參、實參傳遞

    Java必踩的坑之方法中形參、實參傳遞

    這篇文章主要給大家介紹了關于Java必踩的坑之方法中形參、實參傳遞的相關資料,以及Java 形參和實參的區(qū)別,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-03-03
  • java基礎(System.err和System.out)詳解

    java基礎(System.err和System.out)詳解

    下面小編就為大家?guī)硪黄猨ava基礎(System.err和System.out)詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • java 實現(xiàn)回調代碼實例

    java 實現(xiàn)回調代碼實例

    本文主要介紹Java的回調機制,并附實例代碼以供大家參考學習,有需要的小伙伴可以看下
    2016-07-07
  • java中int值直接賦值給char類型的方法詳解

    java中int值直接賦值給char類型的方法詳解

    這篇文章主要給大家介紹了關于java中int值直接賦值給char類型的相關資料,文中通過代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-12-12
  • Spring中的BeanUtils工具類用法

    Spring中的BeanUtils工具類用法

    本文介紹了BeanUtils的基本用法和高級用法,包括copyProperties()、getProperty()、setProperty()等方法,以及如何自定義屬性映射規(guī)則和批量設置屬性值,同時,也指出了使用時需要注意的事項
    2026-03-03
  • Java日常練習題,每天進步一點點(14)

    Java日常練習題,每天進步一點點(14)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • 簡單總結Java的反射機制的運用

    簡單總結Java的反射機制的運用

    這篇文章主要介紹了Java的反射機制的運用,對一些常用的類作了一些說明,需要的朋友可以參考下
    2015-11-11

最新評論

永济市| 兴和县| 定安县| 双牌县| 辽源市| 霍林郭勒市| 赣州市| 克山县| 金川县| 江口县| 宁南县| 珲春市| 沧州市| 仙桃市| 宁城县| 汤阴县| 普陀区| 淮阳县| 汶川县| 浏阳市| 策勒县| 榆树市| 宜兴市| 霍邱县| 卢氏县| 南雄市| 通许县| 栾川县| 南京市| 金阳县| 秦皇岛市| 顺义区| 紫阳县| 乡城县| 巴马| 元谋县| 新邵县| 察雅县| 南雄市| 革吉县| 阿克陶县|