@Resource、@Autowired、@Qualifier的註解注入及區別
阿新 • • 發佈:2018-12-10
在Java程式碼中可以使用 @Resource 或者 @Autowired 註解方式來進行注入。 雖然 @Resource 和 @Autowried 都可以完成依賴注入,但是他們是有區別的。
@Resource
預設是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照型別來注入。
它有兩個屬性是比較重要的:
- name: Spring 將 name 的屬性值解析為 bean 的名稱, 使用 byName 的自動注入策略
- type: Spring 將 type的屬性值解析為 bean 的型別,使用 byType 的自動注入策略
如果既不指定 name 屬性又不指定 type 屬性,Spring這時通過反射機制使用 byName 自動注入策略
@Resource 的裝配順序
- 如果同時指定了 name 屬性和 type 屬性,那麼 Spring 將從容器中找唯一匹配的 bean 進行裝配,找不到則丟擲異常
- 如果指定了 name 屬性值,則從容器中查詢名稱匹配的 bean 進行裝配,找不到則丟擲異常
- 如果指定了 type 屬性值,則從容器中查詢型別匹配的唯一的 bean 進行裝配,找不到或者找到多個都會丟擲異常
- 如果都不指定,則會自動按照 byName 方式進行裝配, 如果沒有匹配,則回退一個原始型別進行匹配,如果匹配則自動裝配
@Autowried
預設是按照型別進行裝配注入,預設情況下,它要求依賴物件必須存在,如果允許 null 值,可以設定它 required 為false。
如果我們想要按名稱進行裝配的話,可以新增一個 @Qualifier 註解解決。
@Autowried @Qualifier("adminDAO") private AdminDAO adminDAO;
@Resource 註解是 J2EE 提供的, 而 @Autowried 是 Spring 提供的,如果想減少對 Spring 的依賴建議使用 @Resource 方法。
@Resource 和 @Autowried 都可以加在欄位的 setter 方法上。