天天看點

@Resource和@Autowired注解的差別以及作用

@Resource和@Autowired注解的差別以及作用

  1. @Resource和@Autowired的作用:都是用來實作依賴注入的,都可以寫在字段或者setter方法之上的。

  2. @Resource和@Autowired注解的差別

 ①@Autowired:由Spring提供,@Resource由Java提供

 ②@Autowired預設是通過 (不指定屬性)type進行自動比對的,當同一個bean擁有相同類型或者注入的bean不存在時則會抛出異常。(特殊情況下邊代碼介紹)

在UserService中注入UserDao:

@Autowired
private UserDao userDao ;
           
 XML注入bean 的方式(對照)
<bean id="userDao" class="com.feicui.pojo.UserDao"/>

 <bean id="userService" class="com.nynu.pojo.UserService">
     <property name="userDao" ref="userDao" />
 </bean>
           
@Resource 預設(不指定屬性)是根據name屬性值來自動注入的(反射機制),其中name和type也是其最重要的兩個屬性。
@Resource     //預設
private String bucketName;  


@Resource(name="userService")
private String bucketName;    
           
注意:name屬性值指的不是XML中id的值而是name的值。

 3.  @Resource和@Autowired的非預設用法

       @Autowired預設情況下對象不能為空在,當需要對象值為null時,可以通過required屬性來設定,

       @Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用

@Autowired () 
@Qualifier ("userDao" )
private UserDao userDao;
           

      @Resource的裝配順序:

         當沒有配置屬性值的時候使用預設的name屬性比對,當比對失敗的時候,則退回原始類型進行比對,比對成功則會自動注入。

         當指定了type屬性時,則從上下文中找到類型比對的唯一bean進行裝配,找不到或者找到多個,都會抛出異常。

         當指定了name屬性時,則從上下文中查找名稱比對的bean進行裝配,找不到則抛出異常。

         當name和type都指定的時候,則從上下文中比對唯一的bean進行裝配,找不到則會抛異常。

參考博文:https://blog.csdn.net/weixin_40423597/article/details/80643990