亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

1.1 隱式依賴注入

當(dāng) @Autowired 注解應(yīng)用于類的 屬性 上時(shí),Spring 會(huì)直接注入該屬性,而不通過構(gòu)造函數(shù)或 setter 方法顯式地傳遞依賴項(xiàng)。

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

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

1.隱式依賴

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

2.難以進(jìn)行單元測(cè)試

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

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

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

1.2 IDE 的警告:Field injection is not recommended

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

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

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

當(dāng) @Autowired 用于 setter 方法 時(shí),Spring 會(huì)通過 setter 注入 方式將依賴項(xiàng)注入到對(duì)象的屬性中。

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

2.1 顯式依賴注入

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

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

符合依賴注入的設(shè)計(jì)原則:通過構(gòu)造函數(shù)或 setter 方法注入依賴項(xiàng),可以使類的依賴關(guān)系更加清晰,符合面向?qū)ο笤O(shè)計(jì)中的 依賴注入單一職責(zé)原則

2.2 可選的依賴注入

setter 注入適用于一些 可選依賴 的場(chǎng)景。如果某個(gè)依賴是可選的,可以通過 setter 方法來靈活注入,而不需要在構(gòu)造器中強(qiáng)制要求依賴項(xiàng)的傳入。

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

2.3 易于測(cè)試

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

3. 構(gòu)造器注入 vs 字段注入 vs Setter 注入

3.1 構(gòu)造器注入(推薦)

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

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

3.2 Setter 注入(次推薦)

Setter 注入 是一個(gè)靈活的選擇,適用于依賴關(guān)系較為可選或后期可更改的場(chǎng)景。它具有以下特點(diǎn):

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

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

3.3 字段注入(不推薦)

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

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

4. 總結(jié)

  • 字段注入不推薦,因?yàn)樗鼘⒁蕾囮P(guān)系隱藏在字段中,難以清晰表達(dá)依賴項(xiàng),增加了測(cè)試的復(fù)雜性。
  • 推薦使用構(gòu)造器注入,它提供了最強(qiáng)的類型安全性和不可變性,增強(qiáng)了代碼的可維護(hù)性和測(cè)試性。
  • Setter 注入適用于可選依賴,但在依賴較多時(shí)容易導(dǎo)致依賴關(guān)系變得模糊,因此需要謹(jǐn)慎使用。

總體而言,使用構(gòu)造器注入和 setter 注入能夠使代碼更清晰、易于維護(hù),同時(shí)支持更好的單元測(cè)試。

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

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

相關(guān)文章

  • Java ScheduledExecutorService的具體使用

    Java ScheduledExecutorService的具體使用

    ScheduledExecutorService有線程池的特性,也可以實(shí)現(xiàn)任務(wù)循環(huán)執(zhí)行,本文主要介紹了Java ScheduledExecutorService的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • Springboot 自定義校驗(yàn)代碼實(shí)例

    Springboot 自定義校驗(yàn)代碼實(shí)例

    這篇文章主要介紹了Springboot 自定義校驗(yàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 基于Java和XxlCrawler獲取各城市月度天氣情況實(shí)踐分享

    基于Java和XxlCrawler獲取各城市月度天氣情況實(shí)踐分享

    本文主要講解使用Java開發(fā)語言,使用XxlCrawler框架進(jìn)行智能的某城市月度天氣抓取實(shí)踐開發(fā),文章首先介紹目標(biāo)網(wǎng)站的相關(guān)頁(yè)面及目標(biāo)數(shù)據(jù)的元素,然后講解在信息獲取過程的一些參數(shù)配置以及問題應(yīng)對(duì),需要的朋友可以參考下
    2024-05-05
  • Java橋接模式實(shí)例詳解【簡(jiǎn)單版與升級(jí)版】

    Java橋接模式實(shí)例詳解【簡(jiǎn)單版與升級(jí)版】

    這篇文章主要介紹了Java橋接模式,結(jié)合實(shí)例形式分析了java橋接模式簡(jiǎn)單版與升級(jí)版兩種實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • Java使用自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換代碼實(shí)例

    Java使用自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換代碼實(shí)例

    這篇文章主要介紹了Java使用自定義注解+反射實(shí)現(xiàn)字典轉(zhuǎn)換代碼實(shí)例,注解是一種能被添加到j(luò)ava代碼中的元數(shù)據(jù),類、方法、變量、參數(shù)和包都可以用注解來修飾,注解對(duì)于它所修飾的代碼并沒有直接的影響,需要的朋友可以參考下
    2023-09-09
  • 簡(jiǎn)單實(shí)現(xiàn)Servlet文件下載功能

    簡(jiǎn)單實(shí)現(xiàn)Servlet文件下載功能

    這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)Servlet文件下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • java開發(fā)ExecutorService監(jiān)控實(shí)現(xiàn)示例詳解

    java開發(fā)ExecutorService監(jiān)控實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了java開發(fā)ExecutorService監(jiān)控實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Android 資源 id詳解及的動(dòng)態(tài)獲取

    Android 資源 id詳解及的動(dòng)態(tài)獲取

    這篇文章主要介紹了Android 資源 id詳解及的動(dòng)態(tài)獲取的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Spring Boot集成LangChain來實(shí)現(xiàn)Rag應(yīng)用的問題小結(jié)

    Spring Boot集成LangChain來實(shí)現(xiàn)Rag應(yīng)用的問題小結(jié)

    檢索增強(qiáng)生成(RAG)是一種優(yōu)化大型語言模型(LLM)輸出的技術(shù),通過引用權(quán)威知識(shí)庫(kù)以增強(qiáng)模型的準(zhǔn)確性和相關(guān)性,RAG允許LLM在不重新訓(xùn)練的情況下訪問特定領(lǐng)域的知識(shí),提高了其在各種應(yīng)用中的實(shí)用性和信任度,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 基于Hibernate中配置文件的學(xué)習(xí)(分享)

    基于Hibernate中配置文件的學(xué)習(xí)(分享)

    下面小編就為大家?guī)硪黄贖ibernate中配置文件的學(xué)習(xí)(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06

最新評(píng)論