成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:@Autowired 和 @Resource 有什么區別?你學會了嗎?

開發 前端
JSR 是 Java Specification Requests 的縮寫,意思是“Java 規范提案”。任何人都可以提交 JSR 給 Java 官方,但只有最終確定的 JSR,才會以 JSR-XXX 的格式發布,如 JSR-250,而被發布的 JSR 就可以看作是 Java 語言的規范或標準。

@Autowired 和 @Resource 都是 Spring/Spring Boot 項目中,用來進行依賴注入的注解。它們都提供了將依賴對象注入到當前對象的功能,但二者卻有眾多不同,并且這也是常見的面試題之一,所以我們今天就來盤它。@Autowired 和 @Resource 的區別主要體現在以下 5 點:

  • 來源不同;
  • 依賴查找的順序不同;
  • 支持的參數不同;
  • 依賴注入的支持不同;
  • 編譯器 IDEA 的提示不同。

1.來源不同

@Autowired 和 @Resource 來自不同的“父類”,其中 @Autowired 是 Spring 定義的注解,而 @Resource 是 Java 定義的注解,它來自于 JSR-250(Java 250 規范提案)。

小知識:JSR 是 Java Specification Requests 的縮寫,意思是“Java 規范提案”。任何人都可以提交 JSR 給 Java 官方,但只有最終確定的 JSR,才會以 JSR-XXX 的格式發布,如 JSR-250,而被發布的 JSR 就可以看作是 Java 語言的規范或標準。

2.依賴查找順序不同

依賴注入的功能,是通過先在 Spring IoC 容器中查找對象,再將對象注入引入到當前類中。而查找有分為兩種實現:按名稱(byName)查找或按類型(byType)查找,其中 @Autowired 和 @Resource 都是既使用了名稱查找又使用了類型查找,但二者進行查找的順序卻截然相反。

2.1 @Autowired 查找順序

@Autowired 是先根據類型(byType)查找,如果存在多個 Bean 再根據名稱(byName)進行查找,它的具體查找流程如下:

圖片

關于以上流程,可以通過查看 Spring 源碼中的 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues 實現分析得出,源碼執行流程如下圖所示:

圖片

2.2 @Resource 查找順序

@Resource 是先根據名稱查找,如果(根據名稱)查找不到,再根據類型進行查找,它的具體流程如下圖所示:

圖片

關于以上流程可以在 Spring 源碼的 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues 中分析得出。雖然 @Resource 是 JSR-250 定義的,但是由 Spring 提供了具體實現,它的源碼實現如下:

圖片

2.3 查找順序小結

由上面的分析可以得出:

  • @Autowired 先根據類型(byType)查找,如果存在多個(Bean)再根據名稱(byName)進行查找;
  • @Resource 先根據名稱(byName)查找,如果(根據名稱)查找不到,再根據類型(byType)進行查找。

3.支持的參數不同

@Autowired 和 @Resource 在使用時都可以設置參數,比如給 @Resource 注解設置 name 和 type 參數,實現代碼如下:

@Resource(name = "userinfo", type = UserInfo.class)
private UserInfo user;

但二者支持的參數以及參數的個數完全不同,其中 @Autowired 只支持設置一個 required 的參數,而 @Resource 支持 7 個參數,支持的參數如下圖所示:

圖片

圖片

4.依賴注入的支持不同

@Autowired 和 @Resource 支持依賴注入的用法不同,常見依賴注入有以下 3 種實現:

  • 屬性注入
  • 構造方法注入
  • Setter 注入

這 3 種實現注入的實現代碼如下。

a) 屬性注入

@RestController
public class UserController {
// 屬性注入
@Autowired
private UserService userService;

@RequestMapping("/add")
public UserInfo add(String username, String password) {
return userService.add(username, password);
}
}

b) 構造方法注入

@RestController
public class UserController {
// 構造方法注入
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 支持屬性注入、構造方法注入和 Setter 注入,而 @Resource 只支持屬性注入和 Setter 注入,當使用 @Resource 實現構造方法注入時就會提示以下錯誤:

圖片

5.編譯器提示不同

當使用 IDEA 專業版在編寫依賴注入的代碼時,如果注入的是 Mapper 對象,那么使用 @Autowired 編譯器會提示報錯信息,報錯內容如下圖所示:

圖片

雖然 IDEA 會出現報錯信息,但程序是可以正常執行的。然后,我們再將依賴注入的注解更改為 @Resource 就不會出現報錯信息了,具體實現如下:

圖片

總結

@Autowired 和 @Resource 都是用來實現依賴注入的注解(在 Spring/Spring Boot 項目中),但二者卻有著 5 點不同:

  • 來源不同:@Autowired 來自 Spring 框架,而 @Resource 來自于(Java)JSR-250;
  • 依賴查找的順序不同:@Autowired 先根據類型再根據名稱查詢,而 @Resource 先根據名稱再根據類型查詢;
  • 支持的參數不同:@Autowired 只支持設置 1 個參數,而 @Resource 支持設置 7 個參數;
  • 依賴注入的用法支持不同:@Autowired 既支持構造方法注入,又支持屬性注入和 Setter 注入,而 @Resource 只支持屬性注入和 Setter 注入;
  • 編譯器 IDEA 的提示不同:當注入 Mapper 對象時,使用 @Autowired 注解編譯器會提示錯誤,而使用 @Resource 注解則不會提示錯誤。

參考 & 鳴謝

  • www.cnblogs.com/felordcn/p/13063802.html
  • blog.csdn.net/CPLASF_/article/details/109225213?
責任編輯:武曉燕 來源: Java面試真題解析
相關推薦

2022-09-27 07:31:57

Property模式數據

2023-02-17 08:02:45

@Autowired@Resource

2022-08-22 07:06:32

MyBatisSQL占位符

2022-07-18 07:11:35

請求轉發請求重定數據共享

2022-08-03 07:04:56

GETHTTPPOST

2022-04-24 07:59:53

synchronizJVMAPI

2022-08-10 07:06:57

IoCDISpring

2022-02-08 07:02:32

進程線程操作系統

2022-08-15 07:06:50

Propertiesyml配置

2023-03-26 21:51:42

2022-04-26 08:02:00

locktryLocklockInterr

2022-10-09 20:52:19

事務隔離級別傳播機制

2022-05-09 07:37:04

Java非公平鎖公平鎖

2023-12-11 08:03:01

Java線程線程組

2024-01-18 09:38:00

Java注解JDK5

2024-04-28 08:24:27

分布式架構Istio

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产一区二区三区 | 欧美一区二区三区在线 | 一区二区三区四区在线播放 | 高清视频一区二区三区 | 亚洲免费高清 | 中文字幕视频在线观看 | 一区二区精品 | 久久国产精品一区二区 | 涩涩导航 | 日韩在线中文 | 黄网免费 | 国产高清在线 | 日韩视频在线一区 | 欧美久久久久久久 | 天堂资源视频 | 国产一二三区电影 | 国产精品一区二区三 | 国产亚洲成av人片在线观看桃 | 妹子干综合 | 国产丝袜人妖cd露出 | 国产精品成人免费 | 欧美精品一区二区三区在线播放 | 日韩中文字幕2019 | 国产免费一区二区三区免费视频 | 国内精品久久精品 | 色久影院| 亚洲视频第一页 | 国产一二区视频 | av福利网站 | 欧美国产日韩在线观看 | 欧美精品一区二区三区在线播放 | 亚洲视频免费观看 | 欧美成人高清 | 久草视频在 | 手机av网 | 亚洲大片| 欧美片网站免费 | 在线免费观看黄a | 黄视频免费观看 | 久久丝袜视频 | 射久久 |