@Resource
@Resource有兩個(gè)常用屬性name铛碑、type,所以分4種情況
- 指定name和type:通過name找到唯一的bean晾捏,找不到拋出異常饺窿;如果type和字段類型不一致,也會(huì)拋出異常
- 指定name:通過name找到唯一的bean沈矿,找不到拋出異常
- 指定type:通過tpye找到唯一的bean上真,如果不唯一,則拋出異常:NoUniqueBeanDefinitionException
- 都不指定:通過字段名作為key去查找羹膳,找到則賦值睡互;找不到則再通過字段類型去查找,如果不唯一陵像,則拋出異常:NoUniqueBeanDefinitionException
- 由J2EE提供就珠,默認(rèn)按照byName自動(dòng)注入
@Resource裝配順序:
(1)如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配醒颖,找不到則拋出異常
(2)如果指定了name嗓违,則從Spring上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常
(3)如果指定了type图贸,則從Spring上下文中找到類型匹配的唯一bean進(jìn)行裝配蹂季,找不到或找到多個(gè),都拋出異常
(4)如果既沒指定name疏日,也沒指定type,則自動(dòng)按照byName方式進(jìn)行裝配偿洁。如果沒有匹配,則回退為一個(gè)原始類型進(jìn)行匹配沟优,如果匹配則自動(dòng)裝配涕滋。
@Resource的作用相當(dāng)于@Autowired,只不過@Autowired按byType自動(dòng)注入挠阁。
@Autowired
@Autowired由Spring提供宾肺,只按照byType注入
@Autowired只有一個(gè)屬性required,默認(rèn)值為true侵俗,為true時(shí)锨用,找不到就拋異常,為false時(shí)隘谣,找不到就賦值為null
@Autowired按類型查找增拥,如果該類型的bean不唯一,則拋出異常;可通過組合注解解決@Autowired()@Qualifier("baseDao")
相同點(diǎn)
- Spring都支持
- 都可以作用在字段和setter方法上
不同點(diǎn)
- Resource是JDK提供的掌栅,而Autowired是Spring提供的
- Resource不允許找不到bean的情況秩仆,而Autowired允許(
@Autowired(required = false)
) - 指定name的方式不一樣,
@Resource(name = "baseDao")
,@Autowired()@Qualifier("baseDao")
- Resource默認(rèn)通過name查找猾封,而Autowired默認(rèn)通過type查找
(1)@Autowired與@Resource都可以用來裝配bean澄耍,都可以寫在字段或setter方法上
(2)@Autowired默認(rèn)按類型裝配,默認(rèn)情況下必須要求依賴對(duì)象存在晌缘,如果要允許null值齐莲,可以設(shè)置它的required屬性為false。如果想使用名稱裝配可以結(jié)合@Qualifier注解進(jìn)行使用枚钓。
(3)@Resource,默認(rèn)按照名稱進(jìn)行裝配瑟押,名稱可以通過name屬性進(jìn)行指定搀捷,如果沒有指定name屬性,當(dāng)注解寫在字段上時(shí)多望,默認(rèn)取字段名進(jìn)行名稱查找嫩舟。如果注解寫在setter方法上默認(rèn)取屬性名進(jìn)行裝配。當(dāng)找不到與名稱匹配的bean時(shí)才按照類型進(jìn)行裝配怀偷。但是需要注意的是家厌,如果name屬性一旦指定,就只會(huì)按照名稱進(jìn)行裝配椎工。
推薦使用@Resource注解在字段上饭于,這樣就不用寫setter方法了,并且這個(gè)注解是屬于J2EE的维蒙,減少了與Spring的耦合掰吕。
轉(zhuǎn)載:注解@Resource與@Autowired的區(qū)別