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