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

面試必問:@Autowired 和 @Resource 有什么區(qū)別?

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

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

  1. 來源不同;
  2. 依賴查找的順序不同;
  3. 支持的參數(shù)不同;
  4. 依賴注入的支持不同;
  5. 編譯器 IDEA 的提示不同。

1、來源不同

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

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

2、依賴查找順序不同

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

(1)@Autowired 查找順序

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

圖片

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

圖片

(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)如下:

圖片

(3)查找順序小結(jié)

由上面的分析可以得出:

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

3、支持的參數(shù)不同

@Autowired 和 @Resource 在使用時都可以設(shè)置參數(shù),比如給 @Resource 注解設(shè)置 name 和 type 參數(shù),實(shí)現(xiàn)代碼如下:

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

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

圖片

圖片

4、依賴注入的支持不同

@Autowired 和 @Resource 支持依賴注入的用法不同,常見依賴注入有以下 3 種實(shí)現(xiàn):

  1. 屬性注入
  2. 構(gòu)造方法注入
  3. 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)造方法注入時就會提示以下錯誤:

圖片

5、編譯器提示不同

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

圖片

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

圖片

總結(jié)

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

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

參考 & 鳴謝

  • www.cnblogs.com/felordcn/p/13063802.html
  • blog.csdn.net/CPLASF_/article/details/109225213
責(zé)任編輯:姜華
相關(guān)推薦

2023-02-01 07:15:16

2022-08-29 07:05:02

JSRJava語言

2022-09-27 07:31:57

Property模式數(shù)據(jù)

2022-08-22 07:06:32

MyBatisSQL占位符

2022-02-08 07:02:32

進(jìn)程線程操作系統(tǒng)

2022-08-15 07:06:50

Propertiesyml配置

2022-08-03 07:04:56

GETHTTPPOST

2022-08-10 07:06:57

IoCDISpring

2022-04-24 07:59:53

synchronizJVMAPI

2023-03-26 21:51:42

2023-02-17 08:10:24

2024-04-03 15:33:04

JWTSession傳輸信息

2024-09-19 08:42:43

2024-09-24 13:49:13

SQL數(shù)據(jù)庫

2021-05-16 14:26:08

RPAIPACIO

2024-05-27 00:40:00

2021-12-17 14:40:02

while(1)for(;;)語言

2022-08-02 08:23:37

SessionCookies

2024-09-09 13:10:14

2024-03-05 18:59:59

前端開發(fā)localhost
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 久久一二区 | 日韩精品久久一区二区三区 | 国产成人99久久亚洲综合精品 | 精品国产乱码久久久久久a丨 | 日韩欧美一二三区 | 91精品在线播放 | 欧美日韩在线观看一区二区三区 | 亚洲成人精品一区二区 | 欧美极品视频在线观看 | 国产精品夜色一区二区三区 | 欧美激情综合五月色丁香小说 | a视频在线播放 | 亚洲国产高清高潮精品美女 | 超碰男人天堂 | 久久在线免费 | 久久久精彩视频 | 亚洲自拍偷拍av | 羞羞色视频 | 日韩欧美成人一区二区三区 | 久久久91精品国产一区二区三区 | 99免费视频| 华丽的挑战在线观看 | 一区在线播放 | 亚洲天天干 | 欧美日韩精品国产 | 国产一区h| 91国语清晰打电话对白 | 视频在线一区二区 | 免费的色网站 | 国产成人免费视频 | 日本中文在线视频 | 成人一级片在线观看 | 亚洲欧美视频一区 | 欧美日批 | 日韩精品一区二区三区在线观看 | 久久精品国产亚洲a | 日本网站免费观看 | 欧美日韩精品 | 国产一区二| 成人国产精品久久 | 国产精品色哟哟网站 |