CTO 說了,不懂 @Autowired 和 @Resource 區(qū)別的人可以領(lǐng)盒飯了
點(diǎn)擊藍(lán)色“程序員黃小斜”關(guān)注我喲
加個(gè)“星標(biāo)”,每天和你一起多進(jìn)步一點(diǎn)點(diǎn)!
@Resource和@Autowired都是做bean的注入時(shí)使用,其實(shí)@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要導(dǎo)入,但是Spring支持該注解的注入。
先上圖:

1、共同點(diǎn)
兩者都可以寫在字段和setter方法上。兩者如果都寫在字段上,那么就不需要再寫setter方法。
基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能。
項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
2、不同點(diǎn)
(1)@Autowired
@Autowired為Spring提供的注解,需要導(dǎo)入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。
public?class?TestServiceImpl?{
???//?下面兩種@Autowired只要使用一種即可
???@Autowired
???private?UserDao?userDao;?//?用于字段上
???
???@Autowired
???public?void?setUserDao(UserDao?userDao)?{
???//?用于屬性的方法上
???????this.userDao?=?userDao;
???}
}
@Autowired注解是按照類型(byType)裝配依賴對(duì)象,默認(rèn)情況下它要求依賴對(duì)象必須存在,如果允許null值,可以設(shè)置它的required屬性為false。如果我們想使用按照名稱(byName)來裝配,可以結(jié)合@Qualifier注解一起使用。如下:
public?class?TestServiceImpl?{
???@Autowired
???@Qualifier("userDao")
???private?UserDao?userDao;
}
注意:
經(jīng)常可以在IDEA中看到關(guān)于@Autowired注解的黃牌警告,如下:
@Autowire
private?JdbcTemplate?jdbcTemplate;
提示的警告信息
Field?injection?is?not?recommended?Inspection?info:?Spring?Team?recommends:?"Always?use?constructor?based?dependency?injection?in?your?beans.?Always?use?assertions?for?mandatory?dependencies".
這段是Spring工作組的建議,大致翻譯一下:
屬性字段注入的方式不推薦,檢查到的問題是:Spring團(tuán)隊(duì)建議:"始終在bean中使用基于構(gòu)造函數(shù)的依賴項(xiàng)注入,始終對(duì)強(qiáng)制性依賴項(xiàng)使用斷言"

原因大家知道了吧?
(2)@Resource
@Resource 是JDK1.6支持的注解,由J2EE提供,需要導(dǎo)入包javax.annotation.Resource。默認(rèn)按照名稱進(jìn)行裝配,名稱可以通過name屬性進(jìn)行指定。也提供按照byType 注入。
@Resource有兩個(gè)重要的屬性:name 和 type,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。
?@Resource(name?=?"userDaoImpl2",type?=?UserDaoImpl.class)
????private?UserDao?userDao;
如果沒有指定name屬性,當(dāng)注解寫在字段上時(shí),默認(rèn)取字段名,按照名稱查找。
當(dāng)注解標(biāo)注在屬性的setter方法上,即默認(rèn)取屬性名作為bean名稱尋找依賴對(duì)象。
當(dāng)找不到與名稱匹配的bean時(shí)才按照類型進(jìn)行裝配。但是需要注意的是,如果name屬性一旦指定,就只會(huì)按照名稱進(jìn)行裝配。
示例:
public?class?TestServiceImpl?{
????//?下面兩種@Resource只要使用一種即可
????@Resource(name="userDao")
????private?UserDao?userDao;?//?用于字段上
????
????@Resource(name="userDao")
????public?void?setUserDao(UserDao?userDao)?{?//?用于屬性的setter方法上
????????this.userDao?=?userDao;
????}
}
注:最好是將@Resource放在setter方法上,因?yàn)檫@樣更符合面向?qū)ο蟮乃枷耄ㄟ^set、get去操作屬性,而不是直接去操作屬性。
@Resource裝配順序:
①如果同時(shí)指定了name和type,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常。
②如果指定了name,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常。
③如果指定了type,則從上下文中找到類似匹配的唯一bean進(jìn)行裝配,找不到或是找到多個(gè),都會(huì)拋出異常。
④如果既沒有指定name,又沒有指定type,則自動(dòng)按照byName方式進(jìn)行裝配;如果沒有匹配,則回退為一個(gè)原始類型進(jìn)行匹配,如果匹配則自動(dòng)裝配。
@Resource的作用相當(dāng)于@Autowired,只不過@Autowired按照byType自動(dòng)注入。

國(guó)家出手,開始整治互聯(lián)網(wǎng)加班了

京東裁員殺紅眼了!說要給n+1,員工簽字后,公司又反悔了!

騰訊云Java工程師一面 + 被撈一面 + 二面面經(jīng)
—?【 THE END 】— 公眾號(hào)[程序員黃小斜]全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)里回復(fù)「m」獲取! 最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù) PDF?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。
謝謝支持喲 (*^__^*)
