溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Intellij IDEA如何去掉@Autowired注入警告

發(fā)布時間:2020-08-04 10:02:57 來源:億速云 閱讀:632 作者:小豬 欄目:編程語言

這篇文章主要為大家展示了Intellij IDEA如何去掉@Autowired注入警告,內(nèi)容簡而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會有收獲的,下面讓小編帶大家一起來看看吧。

問題

在Service層注入Mybatis的Mapper我們通常會使用@Autowired 自動注入

@Autowired
private ProductMapper productMapper;

但是這樣Intellij IDEA會顯示紅色告警,提示不能自動注入。

Intellij IDEA如何去掉@Autowired注入警告

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

Intellij IDEA如何去掉@Autowired注入警告

原因

第一種情況是因為IDEA可以識別并理解Spring的上下文。然而Mapper接口是Mybatis的,IDEA理解不了。所以會出現(xiàn)紅色告警。

而第二種原因是因為官方不推薦使用Filed進(jìn)行注解,而推薦使用構(gòu)造器或Setter方法進(jìn)行注解,像下面兩種寫法就不會出現(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è)務(wù)而不被依賴注入所污染。你只需要把@Autowired扔到變量之上就好了,不需要特殊的構(gòu)造器或者set方法,依賴注入容器會提供你所需的依賴。但是Field注入會帶來2個問題:

  • 當(dāng)注入的對象依賴其他對象,而被依賴的對象沒被創(chuàng)建的話就會出現(xiàn)空指針異常。
  • 這樣的類沒辦法在容器之外被重用,也不能期望反射提供其所需的依賴。

詳細(xì)原因大家可以去這篇文章查看:http://olivergierke.de/2013/11/why-field-injection-is-evil/

構(gòu)造器注入 VS Setter注入

Setter應(yīng)該被用來注入可變的依賴。當(dāng)沒有提供依賴時,這個類也應(yīng)該能夠運轉(zhuǎn)。當(dāng)實例化對象后,這些依賴也能隨時改變。其實也視情況而變,有時,一個不變的對象是理想狀態(tài)。有時,最好是能在運行期間改變對象的屬性。

構(gòu)造器注入對象需要依賴的對象初始化后才能正常運轉(zhuǎn),通過構(gòu)造器提供這些依賴就能保證對象初始化后就能被使用。使用構(gòu)造器注入的一個可能的影響就是循環(huán)依賴。

怎么解決

我們可以使用Lombok提供的注解 @RequiredArgsConstructor 來解決這兩個問題(Lombok這個大家項目都會使用吧)

@Service
@Log4j2
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ProductServiceImpl implements ProductService {
  private final ProductMapper productMapper;
	...
}

這里必須使用final修飾符來修飾注入的Service或Mapper首先我們看看編譯后的類是什么樣

Intellij IDEA如何去掉@Autowired注入警告

編譯完成后變成了使用構(gòu)造器進(jìn)行注入

認(rèn)識@RequiredArgsConstructor

Lombok官方給出的解釋是: Generates constructor that takes one argument per final / non-null field. 所以它會為final和nonnull的屬性作為參數(shù)產(chǎn)生一個構(gòu)造函數(shù)。

而上面我們講了Spring推薦使用Setter或構(gòu)造器注入,那么@RequiredArgsConstructor剛好可以完成這件事,而且還簡化了你的代碼,何樂而不為是不是?

以上就是關(guān)于Intellij IDEA如何去掉@Autowired注入警告的內(nèi)容,如果你們有學(xué)習(xí)到知識或者技能,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI