溫馨提示×

溫馨提示×

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

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

解決使用@Autowired注解警告Field injection is not recommended的問題

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

這篇文章主要解決使用@Autowired注解警告Field injection is not recommended的問題,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

在使用spring框架中的依賴注入注解@Autowired時,idea報了一個警告
大部分被警告的代碼都是不嚴(yán)謹(jǐn)?shù)牡胤?,所以我深入了解了一下?br/>被警告的代碼如下:

  @Autowired
  UserDao userDao;

警告內(nèi)容是

Field injection is not recommended

意思就是使用變量依賴注入的方式是不被推薦的。

使用idea解決策略是這樣的:

Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies

意思就是總是使用構(gòu)造器的方式強制注入。

依賴注入有三種方式:

  • 變量(filed)注入
  • 構(gòu)造器注入
  • set方法注入

先各自看一下實現(xiàn)方式
變量(filed)注入

@Autowired
UserDao userDao;

構(gòu)造器注入

  final
  UserDao userDao;

  @Autowired
  public UserServiceImpl(UserDao userDao) {
    this.userDao = userDao;
  }

set方法注入

  private UserDao userDao;

  @Autowired
  public void setUserDao (UserDao userDao) {
    this.userDao = userDao;
  }

相比較而言:

優(yōu)點:變量方式注入非常簡潔,沒有任何多余代碼,非常有效的提高了java的簡潔性。即使再多幾個依賴一樣能解決掉這個問題。

缺點:不能有效的指明依賴。相信很多人都遇見過一個bug,依賴注入的對象為null,在啟動依賴容器時遇到這個問題都是配置的依賴注入少了一個注解什么的,然而這種方式就過于依賴注入容器了,當(dāng)沒有啟動整個依賴容器時,這個類就不能運轉(zhuǎn),在反射時無法提供這個類需要的依賴。
在使用set方式時,這是一種選擇注入,可有可無,即使沒有注入這個依賴,那么也不會影響整個類的運行。
在使用構(gòu)造器方式時已經(jīng)顯式注明必須強制注入。通過強制指明依賴注入來保證這個類的運行。

另一個方面:

依賴注入的核心思想之一就是被容器管理的類不應(yīng)該依賴被容器管理的依賴,換成白話來說就是如果這個類使用了依賴注入的類,那么這個類擺脫了這幾個依賴必須也能正常運行。然而使用變量注入的方式是不能保證這點的。
既然使用了依賴注入方式,那么就表明這個類不再對這些依賴負責(zé),這些都由容器管理,那么如何清楚的知道這個類需要哪些依賴呢?它就要使用set方法方式注入或者構(gòu)造器注入。

總結(jié)下:

變量方式注入應(yīng)該盡量避免,使用set方式注入或者構(gòu)造器注入,這兩種方式的選擇就要看這個類是強制依賴的話就用構(gòu)造器方式,選擇依賴的話就用set方法注入。

看完上述內(nèi)容,是不是對解決使用@Autowired注解警告Field injection is not recommended的問題有進一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

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

AI