? ??????????????????????????????????????????@Autowired注解與@Resource注解的區(qū)別
Spring不但支持自己定義的@Autowired注解离熏,還支持由JSR-250規(guī)范定義的幾個(gè)注解肖卧。如:@Resource切厘、@PostConstruct及@PreDestroy
1募寨、@Autowired
由Spring提供尚猿,只按照byType注入
2逼蒙、@Resource
由J2EE提供澈蝙,默認(rèn)按照byName自動(dòng)注入
@Resource有兩個(gè)重要的屬性:name和type
Spring將@Resource注解的name屬性解析為bean的名字吓坚,type屬性則解析為bean的類型。所以如果使用name屬性灯荧,則使用byName的自動(dòng)注入策略礁击,而使用type屬性則使用byType自動(dòng)注入策略。如果既不指定name也不指定type屬性逗载,這時(shí)將通過反射機(jī)制使用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)注入置谦。
3堂鲤、使用區(qū)別
(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的耦合樟插。