網(wǎng)站首頁(yè) 編程語言 正文
@Autowired 和 @Resource 都是 Spring/Spring Boot 項(xiàng)目中,用來進(jìn)行依賴注入的注解。它們都提供了將依賴對(duì)象注入到當(dāng)前對(duì)象的功能,但二者卻有眾多不同,并且這也是常見的面試題之一,所以我們今天就來盤它。 @Autowired 和 @Resource 的區(qū)別主要體現(xiàn)在以下 5 點(diǎn):
- 來源不同;
- 依賴查找的順序不同;
- 支持的參數(shù)不同;
- 依賴注入的用法不同;
- 編譯器 IDEA 的提示不同。
1.來源不同
@Autowired 和 @Resource 來自不同的“父類”,其中 @Autowired 是 Spring 定義的注解,而 @Resource 是 Java 定義的注解,它來自于 JSR-250(Java 250 規(guī)范提案)
小知識(shí):JSR 是 Java Specification Requests 的縮寫,意思是“Java 規(guī)范提案”。任何人都可以提交 JSR 給 Java 官方,但只有最終確定的 JSR,才會(huì)以 JSR-XXX 的格式發(fā)布,如 JSR-250,而被發(fā)布的 JSR 就可以看作是 Java 語言的規(guī)范或標(biāo)準(zhǔn)。
2.依賴查找順序不同
依賴注入的功能,是通過先在 Spring IoC 容器中查找對(duì)象,再將對(duì)象注入引入到當(dāng)前類中。而查找有分為兩種實(shí)現(xiàn):按名稱(byName)查找或按類型(byType)查找,其中 @Autowired 和 @Resource 都是既使用了名稱查找又使用了類型查找,但二者進(jìn)行查找的順序卻截然相反。
2.1 @Autowired 查找順序
**@Autowired 是先根據(jù)類型(byType)查找,如果存在多個(gè) Bean 再根據(jù)名稱(byName)進(jìn)行查找,**它的具體查找流程如下:
關(guān)于以上流程,可以通過查看 Spring 源碼中的 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues 實(shí)現(xiàn)分析得出,它的源碼實(shí)現(xiàn)如下:
2.2 @Resource 查找順序
@Resource 是先根據(jù)名稱查找,如果(根據(jù)名稱)查找不到,再根據(jù)類型進(jìn)行查找,它的具體流程如下圖所示:
關(guān)于以上流程可以在 Spring 源碼的 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues 中分析得出。雖然 @Resource 是 JSR-250 定義的,但是由 Spring 提供了具體實(shí)現(xiàn),它的源碼實(shí)現(xiàn)如下:
2.3 查找順序小結(jié)
由上面的分析可以得出:
- @Autowired 先根據(jù)類型(byType)查找,如果存在多個(gè)(Bean)再根據(jù)名稱(byName)進(jìn)行查找;
- @Resource 先根據(jù)名稱(byName)查找,如果(根據(jù)名稱)查找不到,再根據(jù)類型(byType)進(jìn)行查找。
3.支持的參數(shù)不同
@Autowired 和 @Resource 在使用時(shí)都可以設(shè)置參數(shù),比如給 @Resource 注解設(shè)置 name 和 type 參數(shù),實(shí)現(xiàn)代碼如下:
@Resource(name = "userinfo", type = UserInfo.class)
private UserInfo user;
但二者支持的參數(shù)以及參數(shù)的個(gè)數(shù)完全不同,其中 @Autowired 只支持設(shè)置一個(gè) required 的參數(shù),而 @Resource 支持 7 個(gè)參數(shù),支持的參數(shù)如下圖所示:
4.依賴注入的支持不同
@Autowired 和 @Resource 支持依賴注入的用法不同,常見依賴注入有以下 3 種實(shí)現(xiàn):
- 屬性注入
- 構(gòu)造方法注入
- Setter 注入
這 3 種實(shí)現(xiàn)注入的實(shí)現(xiàn)代碼如下。
a) 屬性注入
@RestController
public class UserController {
// 屬性注入
@Autowired
private UserService userService;
@RequestMapping("/add")
public UserInfo add(String username, String password) {
return userService.add(username, password);
}
}
b) 構(gòu)造方法注入
@RestController
public class UserController {
// 構(gòu)造方法注入
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping("/add")
public UserInfo add(String username, String password) {
return userService.add(username, password);
}
}
c) Setter 注入
@RestController
public class UserController {
// Setter 注入
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
@RequestMapping("/add")
public UserInfo add(String username, String password) {
return userService.add(username, password);
}
}
其中, @Autowired 支持屬性注入、構(gòu)造方法注入和 Setter 注入,而 @Resource 只支持屬性注入和 Setter 注入,當(dāng)使用 @Resource 實(shí)現(xiàn)構(gòu)造方法注入時(shí)就會(huì)提示以下錯(cuò)誤:
5.編譯器提示不同
當(dāng)使用 IDEA 專業(yè)版在編寫依賴注入的代碼時(shí),如果注入的是 Mapper 對(duì)象,那么使用 @Autowired 編譯器會(huì)提示報(bào)錯(cuò)信息,報(bào)錯(cuò)內(nèi)容如下圖所示:
雖然 IDEA 會(huì)出現(xiàn)報(bào)錯(cuò)信息,但程序是可以正常執(zhí)行的。 然后,我們?cè)?strong>將依賴注入的注解更改為 @Resource 就不會(huì)出現(xiàn)報(bào)錯(cuò)信息了,具體實(shí)現(xiàn)如下:
總結(jié)
@Autowired 和 @Resource 都是用來實(shí)現(xiàn)依賴注入的注解(在 Spring/Spring Boot 項(xiàng)目中),但二者卻有著 5 點(diǎn)不同:
- 來源不同:@Autowired 來自 Spring 框架,而 @Resource 來自于(Java)JSR-250;
- 依賴查找的順序不同:@Autowired 先根據(jù)類型再根據(jù)名稱查詢,而 @Resource 先根據(jù)名稱再根據(jù)類型查詢;
- 支持的參數(shù)不同:@Autowired 只支持設(shè)置 1 個(gè)參數(shù),而 @Resource 支持設(shè)置 7 個(gè)參數(shù);
- 依賴注入的用法支持不同:@Autowired 既支持構(gòu)造方法注入,又支持屬性注入和 Setter 注入,而 @Resource只支持屬性注入和 Setter 注入;
- 編譯器 IDEA 的提示不同:當(dāng)注入 Mapper 對(duì)象時(shí),使用 @Autowired注解編譯器會(huì)提示錯(cuò)誤,而使用 @Resource 注解則不會(huì)提示錯(cuò)誤。
原文鏈接:https://blog.csdn.net/vvv3171071/article/details/133814794
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-03-22 .NET?6開發(fā)TodoList開發(fā)查詢分頁(yè)_實(shí)用技巧
- 2022-01-03 yarn版本過低導(dǎo)致的報(bào)錯(cuò)
- 2022-12-03 SQL?Server如何通過SQL語句直接操作另一臺(tái)服務(wù)器上的SQL?SERVER的數(shù)據(jù)_MsSql
- 2023-01-20 C#實(shí)現(xiàn)自定義動(dòng)畫鼠標(biāo)的示例詳解_C#教程
- 2023-07-22 BeanFactory和FactoryBean區(qū)別
- 2023-05-18 關(guān)于Python包導(dǎo)入報(bào)錯(cuò)的問題總結(jié)_python
- 2022-04-27 使用jQuery實(shí)現(xiàn)圖片輪播效果_jquery
- 2022-03-23 Android應(yīng)用內(nèi)懸浮窗Activity的簡(jiǎn)單實(shí)現(xiàn)_Android
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支