使用Autowired為什么會(huì)被IDEA警告最佳修改方法
問題原因
關(guān)于這個(gè)問題,其實(shí)答案相對統(tǒng)一,實(shí)際上用大白話說起來也容易理解。
1.初始化問題
先看一下Java初始化類的順序:父類的靜態(tài)字段 > 父類靜態(tài)代碼塊 > 子類靜態(tài)字段 > 子類靜態(tài)代碼塊 > 父類成員變量 > 父類構(gòu)造代碼塊 > 父類構(gòu)造器 > 子類成員變量 > 子類構(gòu)造代碼塊 > 子類構(gòu)造器。
而Autowired注入,則要排隊(duì)到子類構(gòu)造器以后了,SpringIOC并不會(huì)對依賴的bean是否為null做判斷,JVM編譯時(shí)同樣也不會(huì)有問題,但如果使用不當(dāng),運(yùn)行起來時(shí)或許會(huì)因?yàn)槌霈F(xiàn)空指針異常。
2.對IOC容易依賴過強(qiáng)
@Autowired由Spring提供,而@Resource是JSR-250提供的,它是Java標(biāo)準(zhǔn)。前者會(huì)警告,而后者不警告,就是因?yàn)?strong>前者導(dǎo)致了應(yīng)用與框架的強(qiáng)綁定,若是換成其他IOC框架,則不能夠成功注入了。其實(shí)對于這方面,我認(rèn)為在大多數(shù)情況時(shí)是不會(huì)有什么問題的。
3.其他方面
我看到網(wǎng)絡(luò)上有一些其他方面的總結(jié),比如:依賴過多卻不夠明顯,違反了單一職責(zé)原則;不能像構(gòu)造器那樣注入不可變的對象等,這類問題需要結(jié)合個(gè)人實(shí)際開發(fā)進(jìn)行判斷。
對于@Autowired使用方面,它雖然是將業(yè)務(wù)代碼和框架進(jìn)行了強(qiáng)綁定,但字段注入確實(shí)大幅簡化了代碼。追求完完全全的松耦合其實(shí)也過于理想化,應(yīng)該在實(shí)際使用中追求平衡,否則將為了過度追求松耦合而得不償失。
其他使用方式
除了使用@Autowired以外,我們其實(shí)也有幾種好用的方式。使用@Resource替代@Autiwired方法是其中一種,只需要改變一個(gè)注解,這里就不展示了。
1.set方法
@RestController
public class TestController2 {
ITestService testService;
/*
* 基于set注入
* */
@Autowired
public void setTestService(ITestService iTestService) {
this.testService = iTestService;
}
@GetMapping("/status2")
public Result<?> status() {
return testService.status();
}
}這種方法也使用了@Autowired注解,但是它是作用于成員變量的Setter函數(shù)上,而不是像Fied注入一樣作用于成員變量上。
2.構(gòu)造器
@RestController
public class TestController1 {
ITestService testService;
/*
* 基于構(gòu)造方法的注入
* */
public TestController1(ITestService iTestService) {
this.testService = iTestService;
}
@GetMapping("/status1")
public Result<?> status() {
return testService.status();
}
}它的好處在于,采用了構(gòu)造方法注入,這種方式對對象創(chuàng)建的順序會(huì)有要求,它將避免循環(huán)依賴問題。是最可靠的方法。
3.構(gòu)造器的簡化版(推薦)
首先,需要引入lombok依賴。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>隨后,我們在創(chuàng)建時(shí)就可以使用@RequiredArgsConstructor注解,它將幫我們創(chuàng)建構(gòu)造器,final關(guān)鍵字必不可少。
@RestController
@RequiredArgsConstructor
public class TestController3 {
/*
* 用@RequiredArgsConstructor注解,這個(gè)使用方式也可以應(yīng)用于service層
* */
private final ITestService testService;
@GetMapping("/status3")
public Result<?> status() {
return testService.status();
}
}我們在使用這些創(chuàng)建方法時(shí),都可以調(diào)出IDEA的結(jié)構(gòu)(Structure)面板進(jìn)行查看,如下圖所示。

可以看到,在這個(gè)類中,已經(jīng)存在我們所需要注入的內(nèi)容。
在網(wǎng)上有博主總結(jié)了一張表,但因?yàn)榈教幠芸吹?,不知原來出處是哪里?/p>
| 注入方式 | 可靠性 | 可維護(hù)性 | 靈活性 | 循環(huán)關(guān)系檢測 | 性能 |
|---|---|---|---|---|---|
| Field注入 | 不可靠 | 低 | 靈活 | 不檢測 | 啟動(dòng)快 |
| 構(gòu)造方法 | 可靠 | 高 | 不靈活 | 檢測 | 啟動(dòng)慢 |
| set方法 | 不可靠 | 低 | 靈活 | 不檢測 | 啟動(dòng)快 |
總結(jié)
在使用中,使用構(gòu)造方法是比較可行的,加上lombok,其實(shí)也可以到達(dá)非常簡便。
到此這篇關(guān)于使用Autowired為什么會(huì)被IDEA警告,應(yīng)該怎么修改最佳的文章就介紹到這了,更多相關(guān)Autowired IDEA警告內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java編程發(fā)展歷史(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
Java的歷史可以追溯到1991年4月,Sun公司的James Gosling領(lǐng)導(dǎo)的綠色計(jì)劃(Green Project)開始著力發(fā)展一種分布式系統(tǒng)結(jié)構(gòu),使其能夠在各種消費(fèi)性電子產(chǎn)品上運(yùn)行,他們使用了C/C++/Oak語言。由于多種原因,綠色計(jì)劃逐漸陷于停滯狀態(tài)2017-03-03
springboot實(shí)現(xiàn)rabbitmq消息確認(rèn)的示例代碼
RabbitMQ的消息確認(rèn)有兩種, 一種是消息發(fā)送確認(rèn),第二種是消費(fèi)接收確認(rèn),本文主要介紹了springboot實(shí)現(xiàn)rabbitmq消息確認(rèn)的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
eclipse實(shí)現(xiàn)Schnorr數(shù)字簽名
這篇文章主要為大家詳細(xì)介紹了eclipse實(shí)現(xiàn)Schnorr數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06
ReentrantLock從源碼解析Java多線程同步學(xué)習(xí)
這篇文章主要為大家介紹了ReentrantLock從源碼解析Java多線程同步學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Java簡單模擬實(shí)現(xiàn)一個(gè)線程池
本文主要介紹了Java簡單模擬實(shí)現(xiàn)一個(gè)線程池,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
Java中使用內(nèi)存映射實(shí)現(xiàn)大文件上傳實(shí)例
這篇文章主要介紹了Java中使用內(nèi)存映射實(shí)現(xiàn)大文件上傳實(shí)例,本文對比測試了FileInputStream 或者FileOutputStream 抑或RandomAccessFile的頻繁讀寫操作,最后總結(jié)出映射到內(nèi)存后進(jìn)行讀寫以提高速度,需要的朋友可以參考下2015-01-01

