Intellij IDEA如何去掉@Autowired 注入警告的方法
問題
在Service層注入Mybatis的Mapper我們通常會使用@Autowired 自動注入
@Autowired private ProductMapper productMapper;
但是這樣Intellij IDEA會顯示紅色告警,提示不能自動注入。

當我們在Controller層注入Service時我們也經(jīng)常直接在Filed上使用@Autowired 注解,這時候不顯示紅色警告,但是也顯示Field injection is not recommended 的建議

原因
第一種情況是因為IDEA可以識別并理解Spring的上下文。然而Mapper接口是Mybatis的,IDEA理解不了。所以會出現(xiàn)紅色告警。
而第二種原因是因為官方不推薦使用Filed進行注解,而推薦使用構造器或Setter方法進行注解,像下面兩種寫法就不會出現(xiàn)警告。
private final ProductService productService;
@Autowired
public ProductController(ProductService productService) {
this.productService = productService;
}
or
private ProductService productService;
@Autowired
public void setProductService(ProductService productService) {
this.productService = productService;
}
問題是什么
Field注入看起來非常好,夠簡潔,代碼通俗易懂。你的類可以專注于業(yè)務而不被依賴注入所污染。你只需要把@Autowired扔到變量之上就好了,不需要特殊的構造器或者set方法,依賴注入容器會提供你所需的依賴。但是Field注入會帶來2個問題:
- 當注入的對象依賴其他對象,而被依賴的對象沒被創(chuàng)建的話就會出現(xiàn)空指針異常。
- 這樣的類沒辦法在容器之外被重用,也不能期望反射提供其所需的依賴。
詳細原因大家可以去這篇文章查看:http://olivergierke.de/2013/11/why-field-injection-is-evil/
構造器注入 VS Setter注入
Setter應該被用來注入可變的依賴。當沒有提供依賴時,這個類也應該能夠運轉。當實例化對象后,這些依賴也能隨時改變。其實也視情況而變,有時,一個不變的對象是理想狀態(tài)。有時,最好是能在運行期間改變對象的屬性。
構造器注入對象需要依賴的對象初始化后才能正常運轉,通過構造器提供這些依賴就能保證對象初始化后就能被使用。使用構造器注入的一個可能的影響就是循環(huán)依賴。
怎么解決
我們可以使用Lombok提供的注解 @RequiredArgsConstructor 來解決這兩個問題(Lombok這個大家項目都會使用吧)
@Service
@Log4j2
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ProductServiceImpl implements ProductService {
private final ProductMapper productMapper;
...
}
這里必須使用final修飾符來修飾注入的Service或Mapper首先我們看看編譯后的類是什么樣

編譯完成后變成了使用構造器進行注入
認識@RequiredArgsConstructor
Lombok官方給出的解釋是: Generates constructor that takes one argument per final / non-null field. 所以它會為final和nonnull的屬性作為參數(shù)產(chǎn)生一個構造函數(shù)。
而上面我們講了Spring推薦使用Setter或構造器注入,那么@RequiredArgsConstructor剛好可以完成這件事,而且還簡化了你的代碼,何樂而不為是不是?
到此這篇關于Intellij IDEA如何去掉@Autowired 注入警告的方法的文章就介紹到這了,更多相關IDEA去掉@Autowired 注入警告內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Maven安裝本地的jar包和創(chuàng)建帶模板的自定義項目的操作過程
這篇文章主要介紹了Maven安裝本地的jar包和創(chuàng)建帶模板的自定義項目,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-03-03
IDEA的Mybatis Log Plugin插件配置和使用詳解
這篇文章主要介紹了IDEA的Mybatis Log Plugin插件配置和使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
JDK?version和class?file?version(Class編譯版本號)對應關系解讀
這篇文章主要介紹了JDK?version和class?file?version(Class編譯版本號)對應關系,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
FP-Growth算法的Java實現(xiàn)+具體實現(xiàn)思路+代碼
FP-Growth算法比Apriori算法快很多(但是卻比不上時間,how time slipped away)。在網(wǎng)上搜索后發(fā)現(xiàn)Java實現(xiàn)的FP-Growth算法很少,且大多數(shù)不太能理解):太菜。所以就自己實現(xiàn)了一下。這篇文章重點介紹一下我的Java實現(xiàn)2021-06-06
spring batch 讀取多個文件數(shù)據(jù)導入數(shù)據(jù)庫示例
本篇文章主要介紹了spring batch 讀取多個文件數(shù)據(jù)導入數(shù)據(jù)庫示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03

