@Resource和@Autowired注解的差別以及作用
@Resource和@Autowired的作用:都是用來實作依賴注入的,都可以寫在字段或者setter方法之上的。
@Resource和@Autowired注解的差別
①@Autowired:由Spring提供,@Resource由Java提供
②@Autowired預設是通過 (不指定屬性)type進行自動比對的,當同一個bean擁有相同類型或者注入的bean不存在時則會抛出異常。(特殊情況下邊代碼介紹)
在UserService中注入UserDao:
XML注入bean 的方式(對照)@Autowired private UserDao userDao ;
@Resource 預設(不指定屬性)是根據name屬性值來自動注入的(反射機制),其中name和type也是其最重要的兩個屬性。<bean id="userDao" class="com.feicui.pojo.UserDao"/> <bean id="userService" class="com.nynu.pojo.UserService"> <property name="userDao" ref="userDao" /> </bean>
注意:name屬性值指的不是XML中id的值而是name的值。@Resource //預設 private String bucketName; @Resource(name="userService") private String bucketName;
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