Intellij IDEA如何去掉@Autowired 注入警告的方法
問(wèn)題
在Service層注入Mybatis的Mapper我們通常會(huì)使用@Autowired 自動(dòng)注入
@Autowiredprivate ProductMapper productMapper;
但是這樣Intellij IDEA會(huì)顯示紅色告警,提示不能自動(dòng)注入。
當(dāng)我們?cè)贑ontroller層注入Service時(shí)我們也經(jīng)常直接在Filed上使用@Autowired 注解,這時(shí)候不顯示紅色警告,但是也顯示Field injection is not recommended 的建議
原因
第一種情況是因?yàn)镮DEA可以識(shí)別并理解Spring的上下文。然而Mapper接口是Mybatis的,IDEA理解不了。所以會(huì)出現(xiàn)紅色告警。
而第二種原因是因?yàn)楣俜讲煌扑]使用Filed進(jìn)行注解,而推薦使用構(gòu)造器或Setter方法進(jìn)行注解,像下面兩種寫(xiě)法就不會(huì)出現(xiàn)警告。
private final ProductService productService;@Autowiredpublic ProductController(ProductService productService) {this.productService = productService;}
or
private ProductService productService;@Autowiredpublic void setProductService(ProductService productService) {this.productService = productService;}
問(wèn)題是什么
Field注入看起來(lái)非常好,夠簡(jiǎn)潔,代碼通俗易懂。你的類可以專注于業(yè)務(wù)而不被依賴注入所污染。你只需要把@Autowired扔到變量之上就好了,不需要特殊的構(gòu)造器或者set方法,依賴注入容器會(huì)提供你所需的依賴。但是Field注入會(huì)帶來(lái)2個(gè)問(wèn)題:
當(dāng)注入的對(duì)象依賴其他對(duì)象,而被依賴的對(duì)象沒(méi)被創(chuàng)建的話就會(huì)出現(xiàn)空指針異常。 這樣的類沒(méi)辦法在容器之外被重用,也不能期望反射提供其所需的依賴。詳細(xì)原因大家可以去這篇文章查看:http://olivergierke.de/2013/11/why-field-injection-is-evil/
構(gòu)造器注入 VS Setter注入
Setter應(yīng)該被用來(lái)注入可變的依賴。當(dāng)沒(méi)有提供依賴時(shí),這個(gè)類也應(yīng)該能夠運(yùn)轉(zhuǎn)。當(dāng)實(shí)例化對(duì)象后,這些依賴也能隨時(shí)改變。其實(shí)也視情況而變,有時(shí),一個(gè)不變的對(duì)象是理想狀態(tài)。有時(shí),最好是能在運(yùn)行期間改變對(duì)象的屬性。
構(gòu)造器注入對(duì)象需要依賴的對(duì)象初始化后才能正常運(yùn)轉(zhuǎn),通過(guò)構(gòu)造器提供這些依賴就能保證對(duì)象初始化后就能被使用。使用構(gòu)造器注入的一個(gè)可能的影響就是循環(huán)依賴。
怎么解決
我們可以使用Lombok提供的注解 @RequiredArgsConstructor 來(lái)解決這兩個(gè)問(wèn)題(Lombok這個(gè)大家項(xiàng)目都會(huì)使用吧)
@Service@Log4j2@RequiredArgsConstructor(onConstructor = @__(@Autowired))public class ProductServiceImpl implements ProductService { private final ProductMapper productMapper;...}
這里必須使用final修飾符來(lái)修飾注入的Service或Mapper首先我們看看編譯后的類是什么樣
編譯完成后變成了使用構(gòu)造器進(jìn)行注入
認(rèn)識(shí)@RequiredArgsConstructor
Lombok官方給出的解釋是: Generates constructor that takes one argument per final / non-null field. 所以它會(huì)為final和nonnull的屬性作為參數(shù)產(chǎn)生一個(gè)構(gòu)造函數(shù)。
而上面我們講了Spring推薦使用Setter或構(gòu)造器注入,那么@RequiredArgsConstructor剛好可以完成這件事,而且還簡(jiǎn)化了你的代碼,何樂(lè)而不為是不是?
到此這篇關(guān)于Intellij IDEA如何去掉@Autowired 注入警告的方法的文章就介紹到這了,更多相關(guān)IDEA去掉@Autowired 注入警告內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. CSS3+Js實(shí)現(xiàn)響應(yīng)式導(dǎo)航條2. ASP.NET MVC實(shí)現(xiàn)下拉框多選3. CSS3中Transition屬性詳解以及示例分享4. javascript xml xsl取值及數(shù)據(jù)修改第1/2頁(yè)5. 關(guān)于PHP中的Class的幾點(diǎn)個(gè)人看法6. JAVA教程 第八講 Java網(wǎng)絡(luò)編程(一)7. Java Red5服務(wù)器實(shí)現(xiàn)流媒體視頻播放8. Python中三維坐標(biāo)空間繪制的實(shí)現(xiàn)9. 利用js canvas實(shí)現(xiàn)五子棋游戲10. 利用CSS3新特性創(chuàng)建透明邊框三角
