SpringBoot中@Autowired與@Resource的區(qū)別小結(jié)
最近接手了離職同事負(fù)責(zé)的業(yè)務(wù),在處理一個線上工單的時候,看了下歷史邏輯,在閱讀他們寫的代碼時,發(fā)現(xiàn)他們竟然把@Autowired和@Resource注解混用。今天就借此機(jī)會聊聊SpringBoot項(xiàng)目中這兩者之間的區(qū)別。
1. 注解來源
- @Autowired:是Spring框架提供的注解。IOC特性的核心注解之一。
- @Resource:是Java的標(biāo)準(zhǔn)注解,屬于Java EE 規(guī)范(JSR-250)。
2. 注入方式
- @Autowired:默認(rèn)按類型進(jìn)行注入。如果業(yè)務(wù)場景比較復(fù)雜,一個接口有多個實(shí)現(xiàn)類的話,可以結(jié)合@Qualifier注解指定具體的bean。如:
@Service
public class SomeService {
@Autowired
@Qualifier("userServiceImpl1")
private UserService userService1;
@Autowired
@Qualifier("userServiceImpl2")
private UserService userService2;
// 業(yè)務(wù)邏輯
}
- @Resource:默認(rèn)按名稱進(jìn)行注入,即name屬性。如果name屬性沒有指定,則按類型進(jìn)行注入。
@Service
public class SomeService {
@Resource
private UserService userService;
// 業(yè)務(wù)邏輯
}
在這種情況下,Spring 會嘗試查找名稱為 userService 的 bean。如果找不到按名稱匹配的 bean,它會再嘗試按類型進(jìn)行匹配。如果按類型匹配也找不到唯一的 bean,就會拋異常。
用一句話總結(jié)就是:@Autowired相當(dāng)于是@Resource的子集。
3. 依賴檢查
- @Autowired:默認(rèn)情況下,它要求依賴的 bean 必須存在于容器中。如果找不到匹配的 bean,Spring 會拋出 NoSuchBeanDefinitionException 異常??梢酝ㄟ^將 required 屬性設(shè)置為 false 來改變這種行為,使依賴變?yōu)榭蛇x的,這個時候注入的bean就是null。如:
@Service
public class SomeService {
@Autowired(required = false)
private UserService userService;
// 業(yè)務(wù)邏輯
}
- @Resource:沒有類似 required 這樣明確的屬性來控制依賴是否必須存在。當(dāng)按名稱或者類型無法找到匹配的 bean 時,會拋出NameNotFoundException 或 NullPointerException 異常。
4. 使用場景選擇
- @Resource更適合在需要嚴(yán)格按名稱注入的場景下使用。
在 Java EE 環(huán)境中更常見,因?yàn)樗?Java EE 標(biāo)準(zhǔn)。 - @Autowired是 Spring 生態(tài)系統(tǒng)中最常用的依賴注入方式。對于 Spring 生態(tài)系統(tǒng)的開發(fā)者來說,使用頻次很高。特別是在處理復(fù)雜的依賴關(guān)系和需要靈活配置的場景下,通過結(jié)合 @Qualifier 注解,可以實(shí)現(xiàn)精準(zhǔn)的依賴注入。
當(dāng)然,本人也更喜歡使用@Autowired。
到此這篇關(guān)于SpringBoot中@Autowired與@Resource的區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot @Autowired與@Resource內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多線程編程實(shí)戰(zhàn)之模擬大量數(shù)據(jù)同步
這篇文章主要介紹了Java多線程編程實(shí)戰(zhàn)之模擬大量數(shù)據(jù)同步,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02
使用Get方式提交數(shù)據(jù)到Tomcat服務(wù)器的方法
這篇文章將介紹向服務(wù)器發(fā)送數(shù)據(jù),并且服務(wù)器將數(shù)據(jù)的處理結(jié)果返回給客戶端,本文給大家介紹使用Get方式向服務(wù)器發(fā)送數(shù)據(jù),感興趣的朋友一起學(xué)習(xí)吧2016-04-04
Java23種設(shè)計(jì)模式中的單例模式你了解嗎
這篇文章主要為大家詳細(xì)介紹了Java23種設(shè)計(jì)模式中的單例模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
Java?數(shù)據(jù)交換?Json?和?異步請求?Ajax詳解
Json(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,采用鍵值對的形式來表示數(shù)據(jù),它廣泛應(yīng)用于Web開發(fā)中,特別適合于前后端數(shù)據(jù)傳輸和存儲,這篇文章主要介紹了Java數(shù)據(jù)交換Json和異步請求Ajax,需要的朋友可以參考下2023-09-09
Springboot基于enable模塊驅(qū)動的實(shí)現(xiàn)
這篇文章主要介紹了Springboot基于enable模塊驅(qū)動的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
springboot如何通過session實(shí)現(xiàn)單點(diǎn)登入詳解
單點(diǎn)登錄(SSO)的定義是在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng),下面這篇文章主要給大家介紹了關(guān)于springboot如何通過session實(shí)現(xiàn)單點(diǎn)登入的相關(guān)資料,需要的朋友可以參考下2021-12-12

