Intellij IDEA如何去掉@Autowired 注入警告的方法
問題
在Service層注入Mybatis的Mapper我們通常會使用@Autowired
自動注入
@Autowired private ProductMapper productMapper;
但是這樣Intellij IDEA會顯示紅色告警,提示不能自動注入。
當我們在Controller層注入Service時我們也經常直接在Filed上使用@Autowired
註解,這時候不顯示紅色警告,但是也顯示Field injection is not recommended
的建議
原因
第一種情況是因為IDEA可以識別並理解Spring的上下文。然而Mapper介面是Mybatis的,IDEA理解不了。所以會出現紅色告警。
而第二種原因是因為官方不推薦使用Filed進行註解,而推薦使用構造器或Setter方法進行註解,像下面兩種寫法就不會出現警告。
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注入看起來非常好,夠簡潔,程式碼通俗易懂。你的類可以專注於業務而不被依賴注入所汙染。你只需要把@Autowired扔到變數之上就好了,不需要特殊的構造器或者set方法,依賴注入容器會提供你所需的依賴。但是Field注入會帶來2個問題:
- 當注入的物件依賴其他物件,而被依賴的物件沒被建立的話就會出現空指標異常。
- 這樣的類沒辦法在容器之外被重用,也不能期望反射提供其所需的依賴。
詳細原因大家可以去這篇文章檢視:http://olivergierke.de/2013/11/why-field-injection-is-evil/
構造器注入 VS Setter注入
Setter應該被用來注入可變的依賴。當沒有提供依賴時,這個類也應該能夠運轉。當例項化物件後,這些依賴也能隨時改變。其實也視情況而變,有時,一個不變的物件是理想狀態。有時,最好是能在執行期間改變物件的屬性。
構造器注入物件需要依賴的物件初始化後才能正常運轉,通過構造器提供這些依賴就能保證物件初始化後就能被使用。使用構造器注入的一個可能的影響就是迴圈依賴。
怎麼解決
我們可以使用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的屬性作為引數產生一個建構函式。
而上面我們講了Spring推薦使用Setter或構造器注入,那麼@RequiredArgsConstructor剛好可以完成這件事,而且還簡化了你的程式碼,何樂而不為是不是?
到此這篇關於Intellij IDEA如何去掉@Autowired 注入警告的方法的文章就介紹到這了,更多相關IDEA去掉@Autowired 注入警告內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!