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


相信對現在Java碼農來說,@Autowired跟@Resource並不陌生,二者都可以自動注入,但是兩者的區別很多時候並沒有被注意到。

一、注解的出處

@Autowired是Spring提供的注解,需要導入包org.springframework.beans.factory.annotation.Autowired

@Resource是由J2EE提供的注解,需要導入包javax.annotation.Resource

也就是說@Autowired是外部包導入的,而@Resource是J2EE自己的

 

二、自動注入規則

@Autowired默認按照byType自動注入

  @Autowired采取的是按照類型進行自動注入的,Autowired源碼中只有一個屬性required(稍后介紹)。

  說明@Autowired無法人為去干預注入規則的,然后當容器中同一類型的bean存在多個的話,@Autowired該如何去選擇呢,這時就需要@Qualifier注解來幫忙了。

  @Qualifier跟@Autowired來自同一包下,存在一個屬性value,我們可以通過value屬性來確定@Autowired具體注入的是哪一個bean。

  如果匹配不到對象時,將會拋出異常 BeanCreationException。

  如果匹配到多個對象時,也會拋出異常。

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

    1、若沒有使用屬性,則通過反射機制,默認按照byName方式進行裝配,如果沒有匹配,則再類型進行裝配;

    2、若只使用了name屬性,則使用byName的自動注入策略,從上下文中查找名稱id,如果匹配不到則拋出異常;

    3、若只使用了type屬性,則使用byType自動注入策略,從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個都會拋出異常;

    4、若兩個屬性都使用了,則需要找到唯一匹配的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的耦合。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM