国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

IDEA使用@Autowired為什么會(huì)警告?

這篇具有很好參考價(jià)值的文章主要介紹了IDEA使用@Autowired為什么會(huì)警告?。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在使用IDEA編寫Spring相關(guān)的項(xiàng)目時(shí),當(dāng)在字段上使用@Autowired注解時(shí),總會(huì)出現(xiàn)一個(gè)波浪線提示:”Field injection is not recommended.” 這讓我不禁疑惑:我每天都在使用這種方式,為何不被推薦呢?今天,我決定深入探究其中的原因。

眾所周知,Spring框架提供了三種可選的依賴注入方式:構(gòu)造器注入、Setter方法注入和Field注入。在此,我們將詳細(xì)探討這三種注入方式的使用場(chǎng)景。

構(gòu)造器注入

如下所示,在使用構(gòu)造器注入時(shí),我們可以將屬性字段設(shè)置為final。通過構(gòu)造器注入,當(dāng)對(duì)AService進(jìn)行實(shí)例化時(shí),BService對(duì)象必須提前初始化完成,從而確保被注入的對(duì)象一定不為null。構(gòu)造器注入適用于對(duì)象之間存在強(qiáng)依賴關(guān)系的場(chǎng)景,但無(wú)法解決循環(huán)依賴問題(因?yàn)楸仨毣ハ嘁蕾噷?duì)方初始化完成,從而產(chǎn)生沖突,無(wú)法解決)。

關(guān)于循環(huán)依賴問題,推薦閱讀Spring循環(huán)依賴是什么及其解決方式?。該文章會(huì)更深入地講解Spring中循環(huán)依賴的原理和解決方法。

@Service
public class AService {
    private final BService bService;
?
    @Autowired  //spring framework 4.3之后可以不用在構(gòu)造方法上標(biāo)注@Autowired
    public AService(BService bService) {
        this.bService = bService;
    }
}

Setter 方法注入

使用Setter方法進(jìn)行注入時(shí),Spring會(huì)在執(zhí)行默認(rèn)的無(wú)參構(gòu)造函數(shù)實(shí)例化Bean對(duì)象后,調(diào)用Setter方法來注入依賴。這種方式下,我們可以將”required”屬性設(shè)置為false,表示如果注入的Bean對(duì)象不存在,Spring會(huì)直接跳過注入,而不會(huì)報(bào)錯(cuò)。

@Service
public class AService {
    private  BService bService;
?
    @Autowired(required = false)
    public void setbService(BService bService) {
        this.bService = bService;
    }
}

Field注入

的確,F(xiàn)ield注入在視覺上非常簡(jiǎn)潔美觀,因此被廣泛采用。使用Field注入時(shí),Spring容器會(huì)在對(duì)象實(shí)例化完成之后,通過反射機(jī)制來設(shè)置需要注入的字段。

@Service
public class AService {
    @Autowired
    private  BService bService;
}

為什么IDEA不推薦使用Field注入

經(jīng)查閱多方資料,我找到了以下幾個(gè)重要原因,導(dǎo)致Field注入可能不太被推薦使用:

  1. 可能導(dǎo)致空指針異常:如果對(duì)象創(chuàng)建不使用Spring容器,而是直接使用無(wú)參構(gòu)造方法new一個(gè)對(duì)象,此時(shí)使用注入的對(duì)象可能導(dǎo)致空指針異常。
  2. 不能使用final修飾字段:缺乏final修飾會(huì)使得類的依賴可變,進(jìn)而可能引發(fā)一些不可預(yù)料的異常。通常情況下,可以使用構(gòu)造方法注入來聲明強(qiáng)制依賴的Bean,使用Setter方法注入來聲明可選依賴的Bean。
  3. 可能更容易違反單一職責(zé)原則:這是一個(gè)關(guān)鍵原因。使用字段注入可能會(huì)輕易地在類中引入各種依賴,導(dǎo)致類的職責(zé)過多,但開發(fā)者往往難以察覺。相比之下,使用構(gòu)造方法注入,當(dāng)構(gòu)造方法的參數(shù)過多時(shí),會(huì)提示開發(fā)者重構(gòu)這個(gè)類。
  4. 不利于寫單元測(cè)試:在單元測(cè)試中,使用Field注入,必須使用反射的方式來Mock依賴對(duì)象。

為了解決這些問題,我們可以采用以下替代方案:

  • 當(dāng)類有強(qiáng)依賴于其他Bean時(shí),優(yōu)先使用構(gòu)造方法注入。
  • 對(duì)于可選依賴,可以使用Setter方法注入,并在代碼中處理可能出現(xiàn)的引用對(duì)象不存在的情況。

Spring官方的態(tài)度

Spring官方文檔在依賴注入這一節(jié)中的確沒有明確討論字段注入這種方式,而更加強(qiáng)調(diào)了構(gòu)造方法注入和Setter方法注入。構(gòu)造方法注入被視為首選的依賴注入方式,因?yàn)樗梢源_保依賴的對(duì)象在創(chuàng)建時(shí)就被注入,從而避免了一些潛在的問題,比如空指針異常和類的可變性。

Setter方法注入在可選依賴的場(chǎng)景下也很有用,但需要開發(fā)者自行處理依賴對(duì)象不存在的情況。

總的來說,Spring團(tuán)隊(duì)強(qiáng)烈推薦使用構(gòu)造方法注入,因?yàn)樗诤芏喾矫娑几影踩涂煽?。同時(shí),選擇適當(dāng)?shù)囊蕾囎⑷敕绞揭部梢愿鶕?jù)具體情況靈活使用。

總結(jié)

在Spring中使用依賴注入時(shí),首選構(gòu)造方法注入。雖然構(gòu)造方法注入無(wú)法解決循環(huán)依賴問題,但當(dāng)循環(huán)依賴出現(xiàn)時(shí),我們應(yīng)該優(yōu)先考慮是否代碼結(jié)構(gòu)設(shè)計(jì)存在問題。當(dāng)然,也不排除某些必須使用循環(huán)依賴的場(chǎng)景,此時(shí)字段注入可能會(huì)派上用場(chǎng)。

最后,我想強(qiáng)調(diào)的是,在平時(shí)使用IDEA的過程中,關(guān)注代碼下劃線或飄黃的提醒是很重要的。這些提示可以幫助我們學(xué)習(xí)他人總結(jié)的最佳實(shí)踐經(jīng)驗(yàn),提升自己的代碼水平。

本文首發(fā):https://www.panziye.com/java/7639.html

感謝支持!文章來源地址http://www.zghlxwxcb.cn/news/detail-653704.html

到了這里,關(guān)于IDEA使用@Autowired為什么會(huì)警告?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 為什么idea建議使用“+”拼接字符串

    各位小伙伴在字符串拼接時(shí)應(yīng)該都見過下面這種提示: 內(nèi)容翻譯:報(bào)告StringBuffer、StringBuilder或StringJoiner的任何用法,這些用法可以用單個(gè)java.lang.String串聯(lián)來替換。使用字符串串聯(lián)可以使代碼更短、更簡(jiǎn)單。只有當(dāng)?shù)玫降拇?lián)至少與原始代碼一樣高效或更高效時(shí),此檢查才會(huì)

    2024年02月06日
    瀏覽(32)
  • 為什么 IDEA 建議去掉 StringBuilder,而要使用 “+” 拼接字符串?

    為什么 IDEA 建議去掉 StringBuilder,而要使用 “+” 拼接字符串?

    作者:京東零售 姜波 來源:京東云開發(fā)者社區(qū) 各位小伙伴在字符串拼接時(shí)應(yīng)該都見過下面這種提示: 內(nèi)容翻譯:報(bào)告StringBuffer、StringBuilder或StringJoiner的任何用法,這些用法可以用單個(gè)java.lang.String串聯(lián)來替換。使用字符串串聯(lián)可以使代碼更短、更簡(jiǎn)單。只有當(dāng)?shù)玫降拇?lián)至

    2024年02月05日
    瀏覽(39)
  • 【JAVA】為什么要使用封裝以及如何封裝

    【JAVA】為什么要使用封裝以及如何封裝

    個(gè)人主頁(yè):【??個(gè)人主頁(yè)】 系列專欄:【??初識(shí)JAVA】 Java的封裝指的是在一個(gè)類中將數(shù)據(jù)和方法進(jìn)行封裝,使其可以保護(hù)起來,只能在該類內(nèi)部訪問,而不允許外部直接訪問和修改。這是Java面向?qū)ο缶幊痰娜齻€(gè)基本特性之一,另外兩個(gè)是繼承和多態(tài)。在此之前我們已經(jīng)學(xué)

    2024年02月08日
    瀏覽(19)
  • Java開發(fā)手冊(cè)中為什么禁止使用BigDecimal的equals方法做等值比較已經(jīng)為什么禁止使用double直接構(gòu)造BigDecimal

    Java開發(fā)手冊(cè)中為什么禁止使用BigDecimal的equals方法做等值比較已經(jīng)為什么禁止使用double直接構(gòu)造BigDecimal

    阿里Java開發(fā)手冊(cè)嵩山版中明確指出: 1、BigDecimal的等值比較應(yīng)使用compareTo()方法,而不是equals()方法 equals()方法會(huì)比較值和精度(1.0與1.00返回結(jié)果為false),而compareTo()則會(huì)忽略精度 2、禁止使用構(gòu)造方法BigDecimal(double)的方式把double值轉(zhuǎn)換為BigDecimal對(duì)象 BigDecimal(double)存在精度損

    2024年02月07日
    瀏覽(34)
  • Java面試題:為什么HashMap不建議使用對(duì)象作為Key?

    HashMap 是一種基于哈希表的動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),它允許使用任意不可變對(duì)象作為鍵(key)來存儲(chǔ)和檢索數(shù)據(jù)。然而,在某些情況下,使用對(duì)象作為 HashMap 的鍵可能會(huì)遇到一些問題。 ? 首先,我們需要明確對(duì)象作為 HashMap 的鍵需要滿足一些條件: 不可變性:對(duì)象的屬性不能被修改,

    2024年04月22日
    瀏覽(23)
  • <dependency> idea中為什么這個(gè)變黃色

    <dependency> idea中為什么這個(gè)變黃色

    ? 在IDE中,當(dāng)你的代碼出現(xiàn)黃色高亮?xí)r,通常表示存在警告或建議的提示。對(duì)于Maven的 dependency 標(biāo)簽來說,黃色高亮可能有以下幾種原因: 依賴項(xiàng)未找到:黃色高亮可能表示IDE無(wú)法找到指定的依賴項(xiàng)。這可能是由于配置錯(cuò)誤、網(wǎng)絡(luò)問題或倉(cāng)庫(kù)中缺少該依賴項(xiàng)等原因?qū)е碌摹D?/p>

    2024年02月14日
    瀏覽(24)
  • 什么是 Java 中的數(shù)據(jù)庫(kù)連接池?為什么使用連接池來管理數(shù)據(jù)庫(kù)連接?

    什么是 Java 中的數(shù)據(jù)庫(kù)連接池?為什么使用連接池來管理數(shù)據(jù)庫(kù)連接?

    數(shù)據(jù)庫(kù)連接池(database connection pool)是在 Java 中用于管理數(shù)據(jù)庫(kù)連接的一種技術(shù)。它的主要目的是提高數(shù)據(jù)庫(kù)連接的重用性和性能。在傳統(tǒng)的數(shù)據(jù)庫(kù)連接方式中,每次與數(shù)據(jù)庫(kù)建立連接時(shí)都需要進(jìn)行一系列的網(wǎng)絡(luò)通信和身份驗(yàn)證操作,這樣的開銷較大并且會(huì)影響應(yīng)用程序的性

    2024年02月06日
    瀏覽(33)
  • 在Java中使用FileReader.read()進(jìn)行讀取文件時(shí),為什么亂碼??jī)蓚€(gè)方法解決

    在Java中使用FileReader.read()進(jìn)行讀取文件時(shí),為什么亂碼??jī)蓚€(gè)方法解決

    ?以上代碼是有可能出現(xiàn)代碼輸出混亂的情況的,輸出效果如下: 可能會(huì)出現(xiàn)亂碼的問題: 原因可能是文件編碼與程序讀取時(shí)使用的編碼不一致。在創(chuàng)建 FileReader 對(duì)象時(shí),沒有指定文件的編碼格式,因此默認(rèn)使用的是系統(tǒng)默認(rèn)的編碼格式。如果文件中包含非系統(tǒng)默認(rèn)編碼格式

    2024年02月03日
    瀏覽(27)
  • Java開發(fā)手冊(cè)中為什么不建議在for循環(huán)中使用“+“進(jìn)行字符串操作

    Java開發(fā)手冊(cè)中為什么不建議在for循環(huán)中使用“+“進(jìn)行字符串操作

    java開發(fā)手冊(cè)中對(duì)于循環(huán)體中進(jìn)行字符串的拼接要求如下: 【推薦】循環(huán)體內(nèi),字符串的連接方式,使用 StringBuilder 的 append 方法進(jìn)行擴(kuò)展。 說明:下例中,反編譯出的字節(jié)碼文件顯示每次循環(huán)都會(huì) new 出一個(gè) StringBuilder 對(duì)象,然后進(jìn)行 append操作, 最后通過 toString 方法返回

    2024年02月08日
    瀏覽(30)
  • java的springboot框架中使用logback日志框架使用RabbitHandler注解為什么獲取不到消費(fèi)的traceId信息?

    當(dāng)使用 Logback 日志框架和 RabbitMQ 的 @RabbitHandler 注解時(shí),如果無(wú)法獲取消費(fèi)的 traceId 信息,可能是因?yàn)樵谔幚?RabbitMQ 消息時(shí),沒有正確地將 traceId 傳遞到日志中。 為了將 traceId 傳遞到日志中,你可以利用 MDC(Mapped Diagnostic Context)機(jī)制。MDC 是一個(gè)線程綁定的上下文容器,允許

    2024年02月09日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包