相信對如今Java碼農來講,@Autowired跟@Resource並不陌生,兩者均可以自動注入,可是二者的區別不少時候並無被注意到。java
@Autowired是Spring提供的註解,須要導入包org.springframework.beans.factory.annotation.Autowiredspring
@Resource是由J2EE提供的註解,須要導入包javax.annotation.Resourceui
也就是說@Autowired是外部包導入的,而@Resource是J2EE本身的this
@Autowired默認按照byType自動注入spa
@Autowired採起的是按照類型進行自動注入的,Autowired源碼中只有一個屬性required(稍後介紹)。code
說明@Autowired沒法人爲去幹預注入規則的,而後當容器中同一類型的bean存在多個的話,@Autowired該如何去選擇呢,這時就須要@Qualifier註解來幫忙了。對象
@Qualifier跟@Autowired來自同一包下,存在一個屬性value,咱們能夠經過value屬性來肯定@Autowired具體注入的是哪個bean。blog
若是匹配不到對象時,將會拋出異常 BeanCreationException。源碼
若是匹配到多個對象時,也會拋出異常。io
public class UserService { @Autowired @Qualifier(value="userDao1") private UserDao userDao; private ManDao manDao; @Autowired public void setUserDao(@Qualifier("manDao") ManDao manDao) { this.manDao = manDao; } }
@Resource默認按照byName自動注入
@Resource註解在注入規則上存在兩個屬性:name、type
一、若沒有使用屬性,則經過反射機制,默認按照byName方式進行裝配,若是沒有匹配,則再類型進行裝配;
二、若只使用了name屬性,則使用byName的自動注入策略,從上下文中查找名稱id,若是匹配不到則拋出異常;
三、若只使用了type屬性,則使用byType自動注入策略,從上下文中找到類型匹配的惟一bean進行裝配,找不到或者找到多個都會拋出異常;
四、若兩個屬性都使用了,則須要找到惟一匹配的bean進行裝配,找不到則拋出異常。
public class UserService { @Resource private UserDao userDao; @Resource(name="studentDao") private StudentDao studentDao; @Resource(type="TeacherDao") private TeacherDao teacherDao; @Resource(name="manDao",type="ManDao") private ManDao manDao; }
@Autowired:默認按照類型進行裝配,默認狀況下要求依賴的對象必須存在,若是須要容許null值,則須要設置required屬性爲false,@Autowired(required=false)。
@Resource:默認按照名稱進行裝配,容許爲null。
二者均可以寫在字段和setter方法上,若是寫在字段上,那麼就不須要在寫setter方法。
推薦使用@Resource註解在字段上,這樣不只不須要寫setter方法了,並且因爲@Resource屬於J2EE,下降與spring的耦合。