@AutoWired與@Resource註解
阿新 • • 發佈:2022-03-04
首先對於這倆個註解:
@Autowired是Spring中的註解,
@Resource是JSR-250中提供的註解,即Java提供的註解,從包名就可以看出來
Autowired:org.springframework.beans.factory.annotation.Autowired Resource:javax.annotation.Resource
@AutoWired
@Autowired的依賴注入過程是由AutowiredAnnotationBeanPostProcessor支援的
具體的注入邏輯在DefaultListableBeanFactory#doResolveDependency方法
@Autowired的注入邏輯如下
- 找到所有型別符合的bean
- 如果沒有型別符合的bean,則看@Autowired的required屬性是否為true,是則丟擲異常,否則返回null
- 如果只有一個,則將這個bean注入
- 如果有多個bean 4.1 選擇其中帶有Primary註解的bean,如果只有一個直接注入,如果有多個bean帶有Primary註解則報錯,如果不存在就下一步 4.2 選擇其中優先順序最高的bean(優先順序使用javax.annotation.Priority表明),如果只有一個直接注入,如果有多個bean的優先順序並列最高則報錯,如果不存在就下一步 4.3 選擇beanName和當前要注入的屬性名相同的bean進行注入,有則注入,沒有則報錯
@Resource
@Resource的依賴注入過程是由CommonAnnotationBeanPostProcessor支援的
具體的注入邏輯在CommonAnnotationBeanPostProcessor#autowireResource
@Resource的注入邏輯如下
- 如果@Resource指定了name,則只會按照name進行查詢,當找不到時丟擲異常,找到將bean注入
- 如果@Resource沒有指定name,則把屬性名作為名字進行查詢,找到將bean注入,當按照名字查詢不到時,按照型別進行查詢
「注意:@Resource按照型別查詢的邏輯和@Autowired的一樣,因為都是呼叫了DefaultListableBeanFactory#doResolveDependency方法」
總結
@Autowired:先byType再byName
@Resource:先byName再byType(當指定@Resource name屬性時,只會byName)
學有所思,思有所成。