1. 程式人生 > 其它 >@AutoWired與@Resource註解

@AutoWired與@Resource註解

首先對於這倆個註解:

@Autowired是Spring中的註解,

@Resource是JSR-250中提供的註解,即Java提供的註解,從包名就可以看出來

Autowired:org.springframework.beans.factory.annotation.Autowired Resource:javax.annotation.Resource

@AutoWired

@Autowired的依賴注入過程是由AutowiredAnnotationBeanPostProcessor支援的

具體的注入邏輯在DefaultListableBeanFactory#doResolveDependency方法

@Autowired的注入邏輯如下

  1. 找到所有型別符合的bean
  2. 如果沒有型別符合的bean,則看@Autowired的required屬性是否為true,是則丟擲異常,否則返回null
  3. 如果只有一個,則將這個bean注入
  4. 如果有多個bean 4.1 選擇其中帶有Primary註解的bean,如果只有一個直接注入,如果有多個bean帶有Primary註解則報錯,如果不存在就下一步 4.2 選擇其中優先順序最高的bean(優先順序使用javax.annotation.Priority表明),如果只有一個直接注入,如果有多個bean的優先順序並列最高則報錯,如果不存在就下一步 4.3 選擇beanName和當前要注入的屬性名相同的bean進行注入,有則注入,沒有則報錯

@Resource

@Resource的依賴注入過程是由CommonAnnotationBeanPostProcessor支援的

具體的注入邏輯在CommonAnnotationBeanPostProcessor#autowireResource

@Resource的注入邏輯如下

  1. 如果@Resource指定了name,則只會按照name進行查詢,當找不到時丟擲異常,找到將bean注入
  2. 如果@Resource沒有指定name,則把屬性名作為名字進行查詢,找到將bean注入,當按照名字查詢不到時,按照型別進行查詢

「注意:@Resource按照型別查詢的邏輯和@Autowired的一樣,因為都是呼叫了DefaultListableBeanFactory#doResolveDependency方法」

總結

@Autowired:先byType再byName

@Resource:先byName再byType(當指定@Resource name屬性時,只會byName)

學有所思,思有所成。