區別:
@Autowired默認是按類型裝配,且這個註解是屬於spring的,默認情況下必須要求依賴對象必須存在,如果要運行null值,可以設置它的required屬性爲false,即@Autowired(required=false)。如果我們想使用名稱裝配可以結合@Qualifier註解進行使用,如下:
@Resource默認是按照名稱來進行裝配。名稱可以通過name屬性進行指定,如果沒有指定name屬性,當註解寫在字段上時,默認取字段名,按照名稱查找,如果註解寫在setter方法上默認取屬性名進行裝配。當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。
怎麼理解按類型裝配還是按照名稱轉配?
比如我們定義兩個class爲com.test.User類的bean,其中一個beanid爲user1,另一個beanid爲user2。
<beanid="staff"class="com.test.Staff"/>
<beanid="user1"class="com.test.User">
<property name="name"value="zhangsan"/></bean>
<beanid="user2"class="com.test.User">
<property name="name"value="lisi"/></bean>
下面我們爲bean staff注入bean User
public class Staff{
@Autowired
private User user;
}
上面我們說過@Autowired是按類型裝配,那麼此時它就會根據com.test.User,找到兩個bean,user1和user2,當我們運行上面的例子,則會拋出異常,Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.test.User] is defined: expected single matching bean but found2: [user1, user2],此時我們需要使用@Qualifier,標註具體是注入哪個bean。
public class Staff{
@Resource(name="user1")
private User user;
}
而@Resource是按名稱裝配,我們只需要通過name指定bean即可。
public class Staff{
@Resource(name="user1")
private User user;
}