@Autowired註解與@Resource註解的區別(詳細)

相信對如今Java碼農來講,@Autowired跟@Resource並不陌生,兩者均可以自動注入,可是二者的區別不少時候並無被注意到。java

1、註解的出處

@Autowired是Spring提供的註解,須要導入包org.springframework.beans.factory.annotation.Autowiredspring

@Resource是由J2EE提供的註解,須要導入包javax.annotation.Resourceui

也就是說@Autowired是外部包導入的,而@Resource是J2EE本身的this

 

2、自動注入規則

@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; 
}

 

3、注入時對象是否存在

@Autowired:默認按照類型進行裝配,默認狀況下要求依賴的對象必須存在,若是須要容許null值,則須要設置required屬性爲false,@Autowired(required=false)。

@Resource:默認按照名稱進行裝配,容許爲null。

 

4、使用位置

二者均可以寫在字段和setter方法上,若是寫在字段上,那麼就不須要在寫setter方法。

推薦使用@Resource註解在字段上,這樣不只不須要寫setter方法了,並且因爲@Resource屬於J2EE,下降與spring的耦合。

相關文章
相關標籤/搜索