使用Autowired為什么會被IDEA警告最佳修改方法
問題原因
關(guān)于這個問題,其實答案相對統(tǒng)一,實際上用大白話說起來也容易理解。
1.初始化問題
先看一下Java初始化類的順序:父類的靜態(tài)字段 > 父類靜態(tài)代碼塊 > 子類靜態(tài)字段 > 子類靜態(tài)代碼塊 > 父類成員變量 > 父類構(gòu)造代碼塊 > 父類構(gòu)造器 > 子類成員變量 > 子類構(gòu)造代碼塊 > 子類構(gòu)造器。
而Autowired注入,則要排隊到子類構(gòu)造器以后了,SpringIOC并不會對依賴的bean是否為null做判斷,JVM編譯時同樣也不會有問題,但如果使用不當(dāng),運行起來時或許會因為出現(xiàn)空指針異常。
2.對IOC容易依賴過強
@Autowired由Spring提供,而@Resource是JSR-250提供的,它是Java標(biāo)準(zhǔn)。前者會警告,而后者不警告,就是因為前者導(dǎo)致了應(yīng)用與框架的強綁定,若是換成其他IOC框架,則不能夠成功注入了。其實對于這方面,我認(rèn)為在大多數(shù)情況時是不會有什么問題的。
3.其他方面
我看到網(wǎng)絡(luò)上有一些其他方面的總結(jié),比如:依賴過多卻不夠明顯,違反了單一職責(zé)原則;不能像構(gòu)造器那樣注入不可變的對象等,這類問題需要結(jié)合個人實際開發(fā)進行判斷。
對于@Autowired使用方面,它雖然是將業(yè)務(wù)代碼和框架進行了強綁定,但字段注入確實大幅簡化了代碼。追求完完全全的松耦合其實也過于理想化,應(yīng)該在實際使用中追求平衡,否則將為了過度追求松耦合而得不償失
。
其他使用方式
除了使用@Autowired以外,我們其實也有幾種好用的方式。使用@Resource替代@Autiwired方法是其中一種,只需要改變一個注解,這里就不展示了。
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án)依賴問題。是最可靠的方法。
3.構(gòu)造器的簡化版(推薦)
首先,需要引入lombok依賴。
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> </dependency>
隨后,我們在創(chuàng)建時就可以使用@RequiredArgsConstructor注解,它將幫我們創(chuàng)建構(gòu)造器,final關(guān)鍵字必不可少
。
@RestController @RequiredArgsConstructor public class TestController3 { /* * 用@RequiredArgsConstructor注解,這個使用方式也可以應(yīng)用于service層 * */ private final ITestService testService; @GetMapping("/status3") public Result<?> status() { return testService.status(); } }
我們在使用這些創(chuàng)建方法時,都可以調(diào)出IDEA的結(jié)構(gòu)(Structure)面板進行查看,如下圖所示。
可以看到,在這個類中,已經(jīng)存在我們所需要注入的內(nèi)容。
在網(wǎng)上有博主總結(jié)了一張表,但因為到處能看到,不知原來出處是哪里。
注入方式 | 可靠性 | 可維護性 | 靈活性 | 循環(huán)關(guān)系檢測 | 性能 |
---|---|---|---|---|---|
Field注入 | 不可靠 | 低 | 靈活 | 不檢測 | 啟動快 |
構(gòu)造方法 | 可靠 | 高 | 不靈活 | 檢測 | 啟動慢 |
set方法 | 不可靠 | 低 | 靈活 | 不檢測 | 啟動快 |
總結(jié)
在使用中,使用構(gòu)造方法是比較可行的,加上lombok,其實也可以到達非常簡便。
到此這篇關(guān)于使用Autowired為什么會被IDEA警告,應(yīng)該怎么修改最佳的文章就介紹到這了,更多相關(guān)Autowired IDEA警告內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java編程發(fā)展歷史(動力節(jié)點Java學(xué)院整理)
Java的歷史可以追溯到1991年4月,Sun公司的James Gosling領(lǐng)導(dǎo)的綠色計劃(Green Project)開始著力發(fā)展一種分布式系統(tǒng)結(jié)構(gòu),使其能夠在各種消費性電子產(chǎn)品上運行,他們使用了C/C++/Oak語言。由于多種原因,綠色計劃逐漸陷于停滯狀態(tài)2017-03-03springboot實現(xiàn)rabbitmq消息確認(rèn)的示例代碼
RabbitMQ的消息確認(rèn)有兩種, 一種是消息發(fā)送確認(rèn),第二種是消費接收確認(rèn),本文主要介紹了springboot實現(xiàn)rabbitmq消息確認(rèn)的示例代碼,具有一定的參考價值,感興趣的可以了解一下2023-09-09eclipse實現(xiàn)Schnorr數(shù)字簽名
這篇文章主要為大家詳細介紹了eclipse實現(xiàn)Schnorr數(shù)字簽名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06ReentrantLock從源碼解析Java多線程同步學(xué)習(xí)
這篇文章主要為大家介紹了ReentrantLock從源碼解析Java多線程同步學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-04-04Java中使用內(nèi)存映射實現(xiàn)大文件上傳實例
這篇文章主要介紹了Java中使用內(nèi)存映射實現(xiàn)大文件上傳實例,本文對比測試了FileInputStream 或者FileOutputStream 抑或RandomAccessFile的頻繁讀寫操作,最后總結(jié)出映射到內(nèi)存后進行讀寫以提高速度,需要的朋友可以參考下2015-01-01