@Autowired 與@Resource的區別
前言
面試被這兩個註解整懵逼了。。。。。。。。。。。且看文筆君接下來解析
@Resource
@Resource (建議用 這個注解屬於J2EE的)
類全稱: javax.annotation.Resource
預設注入方式: byName(反射機制)
指定注入方式:
1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常
2. 如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常
3. 如果指定了type,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常
4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始型別進行匹配,如果匹配則自動裝配;
@Autowired
@Autowired (這個註解是屬業spring的)
類全稱: org.springframework.beans.factory.annotation.Autowired
預設注入方式: byType
Bean查詢規則:
a)預設是要物件必須存在的, 如果允許物件為null, 則要設定required
= false
b)如果是根據型別查詢, 有多個相同型別(is-a)的實現類,那麼會丟擲異常 , 此時需要加上@Qualifier("hello")註解指定注入的Bean的標識名稱(不一定特指id或者name,就是指的@Service("thisTarget")中的thisTarget這個值,也不排除沒有這個值自動查詢其id或者name的可能性), 則按照標識名稱去查詢,若有多個相同名稱的Bean,則丟擲異常.
@Autowired 與@Resource的區別
1、@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource預設按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略
2、@Autowired預設按型別裝配
@Autowired
()
@Qualifier
(
"baseDao"
)
private
BaseDao baseDao;
總結:
@Autowired//預設按type注入
@Qualifier("cusInfoService")//一般作為@Autowired()的修飾用
@Resource(name="cusInfoService")//預設按name注入,可以通過name和type屬性進行選擇性注入
一般@Autowired和@Qualifier一起用,@Resource單獨用。
當然沒有衝突的話@Autowired也可以單獨用
@Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。 等價於 @Resource
注意:@Autowired 有時候會出現警告
Spring屬於第三方的,J2EE是Java自己的東西。使用@Resource可以減少程式碼和Spring之間的耦合。