這篇文章主要為大家展示了Intellij IDEA如何去掉@Autowired注入警告,內(nèi)容簡(jiǎn)而易懂,希望大家可以學(xué)習(xí)一下,學(xué)習(xí)完之后肯定會(huì)有收獲的,下面讓小編帶大家一起來(lái)看看吧。
創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都網(wǎng)站制作、鎮(zhèn)賚網(wǎng)絡(luò)推廣、微信平臺(tái)小程序開(kāi)發(fā)、鎮(zhèn)賚網(wǎng)絡(luò)營(yíng)銷、鎮(zhèn)賚企業(yè)策劃、鎮(zhèn)賚品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供鎮(zhèn)賚建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
問(wèn)題
在Service層注入Mybatis的Mapper我們通常會(huì)使用@Autowired
自動(dòng)注入
@Autowired private 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; @Autowired public ProductController(ProductService productService) { this.productService = productService; }
or
private ProductService productService; @Autowired public 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)題:
詳細(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注入警告的內(nèi)容,如果你們有學(xué)習(xí)到知識(shí)或者技能,可以把它分享出去讓更多的人看到。