最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文搞懂Spring中@Autowired和@Resource的區(qū)別

 更新時(shí)間:2022年08月29日 10:17:45   作者:Java中文社群  
@Autowired?和?@Resource?都是?Spring/Spring?Boot?項(xiàng)目中,用來(lái)進(jìn)行依賴注入的注解。它們都提供了將依賴對(duì)象注入到當(dāng)前對(duì)象的功能,但二者卻有眾多不同,并且這也是常見(jiàn)的面試題之一,所以我們今天就來(lái)盤它

@Autowired 和 @Resource 都是 Spring/Spring Boot 項(xiàng)目中,用來(lái)進(jìn)行依賴注入的注解。它們都提供了將依賴對(duì)象注入到當(dāng)前對(duì)象的功能,但二者卻有眾多不同,并且這也是常見(jiàn)的面試題之一,所以我們今天就來(lái)盤它。

@Autowired 和 @Resource 的區(qū)別主要體現(xiàn)在以下 5 點(diǎn):

  • 來(lái)源不同;
  • 依賴查找的順序不同;
  • 支持的參數(shù)不同;
  • 依賴注入的用法不同;
  • 編譯器 IDEA 的提示不同。

1.來(lái)源不同

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

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

2.依賴查找順序不同

依賴注入的功能,是通過(guò)先在 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)于以上流程,可以通過(guò)查看 Spring 源碼中的

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues 實(shí)現(xiàn)分析得出,源碼執(zhí)行流程如下圖所示:

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 支持依賴注入的用法不同,常見(jiàn)依賴注入有以下 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 都是用來(lái)實(shí)現(xiàn)依賴注入的注解(在 Spring/Spring Boot 項(xiàng)目中),但二者卻有著 5 點(diǎn)不同:

  • 來(lái)源不同:@Autowired 來(lái)自 Spring 框架,而 @Resource 來(lái)自于(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ò)誤。

以上就是一文搞懂Spring中@Autowired和@Resource的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Spring @Autowired @Resource區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java中jdk代理和cglib代理使用步驟詳解

    java中jdk代理和cglib代理使用步驟詳解

    這篇文章主要給大家介紹了關(guān)于java中jdk代理和cglib代理使用步驟的相關(guān)資料,JDK代理和CGLIB是Java中兩種常見(jiàn)的代理實(shí)現(xiàn)方式,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • ElasticSearch學(xué)習(xí)之Es集群Api操作示例

    ElasticSearch學(xué)習(xí)之Es集群Api操作示例

    這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之Es集群Api操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Java多線程之volatile關(guān)鍵字及內(nèi)存屏障實(shí)例解析

    Java多線程之volatile關(guān)鍵字及內(nèi)存屏障實(shí)例解析

    volatile是JVM提供的一種最輕量級(jí)的同步機(jī)制,因?yàn)镴ava內(nèi)存模型為volatile定義特殊的訪問(wèn)規(guī)則,使其可以實(shí)現(xiàn)Java內(nèi)存模型中的兩大特性:可見(jiàn)性和有序性。這篇文章主要介紹了Java多線程之volatile關(guān)鍵字及內(nèi)存屏障,需要的朋友可以參考下
    2019-05-05
  • Java設(shè)計(jì)模式之觀察者模式解析

    Java設(shè)計(jì)模式之觀察者模式解析

    這篇文章主要介紹了Java設(shè)計(jì)模式之觀察者模式解析,觀察者模式,又被稱為發(fā)布/訂閱模式,它定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)某一個(gè)主題對(duì)象,這個(gè)主題對(duì)象在狀態(tài)變化時(shí),會(huì)通知所有的觀察者對(duì)象,使他們能夠自動(dòng)更新自己,需要的朋友可以參考下
    2023-09-09
  • SpringBoot配置Https入門實(shí)踐

    SpringBoot配置Https入門實(shí)踐

    本文主要介紹了SpringBoot配置Https入門實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11
  • java 字符串截取的實(shí)例詳解

    java 字符串截取的實(shí)例詳解

    這篇文章主要介紹了java 字符串截取的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Docker?DockerFile部署java?jar項(xiàng)目包及Mysql和Redis的詳細(xì)過(guò)程

    Docker?DockerFile部署java?jar項(xiàng)目包及Mysql和Redis的詳細(xì)過(guò)程

    Dockerfile是一種用于構(gòu)建Docker鏡像的文件格式,可以通過(guò)Dockerfile部署Java項(xiàng)目,這篇文章主要給大家介紹了關(guān)于Docker?DockerFile部署java?jar項(xiàng)目包及Mysql和Redis的詳細(xì)過(guò)程,需要的朋友可以參考下
    2023-12-12
  • Idea實(shí)現(xiàn)接口的方法上無(wú)法添加@Override注解的解決方案

    Idea實(shí)現(xiàn)接口的方法上無(wú)法添加@Override注解的解決方案

    文章介紹了在IDEA中實(shí)現(xiàn)接口方法時(shí)無(wú)法添加@Override注解的問(wèn)題及其解決方法,主要步驟包括更改項(xiàng)目結(jié)構(gòu)中的Language level到支持該注解的版本,以及在pom.xml文件中指定maven-compiler-plugin的版本以解決自動(dòng)更新后的問(wèn)題
    2025-02-02
  • datax-web在windows環(huán)境idea中模塊化打包部署操作步驟

    datax-web在windows環(huán)境idea中模塊化打包部署操作步驟

    這篇文章主要介紹了datax-web在windows環(huán)境idea中模塊化打包部署操作步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • 一文帶你看懂Android動(dòng)畫的實(shí)現(xiàn)原理

    一文帶你看懂Android動(dòng)畫的實(shí)現(xiàn)原理

    動(dòng)畫是 Android 應(yīng)用程序中重要的交互特性,ndroid 提供了多種動(dòng)畫效果,包括平移、縮放、旋轉(zhuǎn)和透明度等,它們可以通過(guò)代碼或 XML 來(lái)實(shí)現(xiàn),本文將介紹 Android 動(dòng)畫的原理和實(shí)現(xiàn)方法,并提供一些示例,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

张掖市| 临湘市| 饶阳县| 阿坝县| 车致| 浦城县| 永福县| 巴林左旗| 台东县| 神木县| 沅江市| 师宗县| 泊头市| 宁海县| 新宁县| 江门市| 游戏| 嘉善县| 新沂市| 邵阳县| 安吉县| 江油市| 九寨沟县| 四子王旗| 绥中县| 诸暨市| 兴隆县| 西畴县| 富顺县| 开原市| 卓尼县| 平利县| 无锡市| 仁布县| 仲巴县| 崇明县| 南涧| 若尔盖县| 永修县| 富平县| 密山市|