@Autowired和@Resource有哪些區別

树叶的一生啊發表於2024-07-09

一、註解的作用

@Autowired和@Resource都是用來實現Bean的自動注入功能。

二、@Autowired和@Resource的區別

1、所屬的包不同

  • @Autowired是Spring的註解。
  • @Resource是JSR-250的註解。

IDEA 有時候會在 @Autowired 註解上面提示Field injection is not recommended (欄位注入是不被推薦的)這個警告,雖然並不屬於報錯,但是確實是警告的存在。
就是因為@Autowired是Spring提供的,它是特定IoC提供的特定註解,這就導致了應用與框架的強繫結,一旦換用了其他的IoC框架,是不能夠支援注入的。
而 @Resource是 Java 自己提供的,它是Java標準,所以它是與框架無關的。

2、依賴注入的支援不同

  • @Autowired能夠用在建構函式、setter方法、屬性上。
  • @Resource只能用在setter方法、屬性上。

3、注入的預設型別不同

依賴注入功能,是先在容器中查詢需要的物件,再將物件注入到當前類中。
查詢的方式有兩種:

  • byType:根據型別注入,如果容器中有多個相同型別的bean,則注入失敗。
  • byName:根據名稱注入,如果容器中有多個相同名稱的bean,則注入失敗。

@Autowired和@Resource都用到了byType和byName兩種方式,但二者的使用順序卻不同。

@Autowired預設按型別注入,預設情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false。
如果根據型別找不到合適的bean,則會丟擲異常。
如果根據型別找到了多個bean,則再根據bean的名稱進行匹配,如果匹配成功,則注入成功;如果匹配失敗,則丟擲異常。

@Autowired自動注入順序流程圖:

@Resource預設按名稱注入,如果按名稱注入找不到合適的bean,則再按型別注入。

@Resource自動注入順序流程圖:

也就是:

  • @Autowired預設先根據型別查詢,如果找到多個,再根據名稱查詢;
  • @Resource預設先根據名稱查詢,如果找不到,再按型別查詢。

三、總結

在Spring專案中,這兩個註解一般可以互相替換。
主要是要了解它們的注入順序。

相關文章