欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

  • 來源不同;
  • 依賴查找的順序不同;
  • 支持的參數(shù)不同;
  • 依賴注入的用法不同;
  • 編譯器 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)行查找的順序卻截然相反。

2.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.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)查找,如果存在多個(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):

  • 屬性注入
  • 構(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)造方法注入時就會提示以下錯誤:

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)不同:

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

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

相關(guān)文章

  • mybatis自動生成時如何設(shè)置不生成Example類詳解

    mybatis自動生成時如何設(shè)置不生成Example類詳解

    這篇文章主要給大家介紹了關(guān)于mybatis自動生成時如何設(shè)置不生成Example類的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • 如何使用Java操作Zookeeper

    如何使用Java操作Zookeeper

    這篇文章主要介紹了如何使用Java操作Zookeeper,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-04-04
  • java 線性表接口的實(shí)例詳解

    java 線性表接口的實(shí)例詳解

    這篇文章主要介紹了java 線性表接口的實(shí)現(xiàn)實(shí)例詳解的相關(guān)資料,希望通過本能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Java中單例模式的七種寫法示例

    Java中單例模式的七種寫法示例

    作為一個Java開發(fā)者,也許你覺得自己對單例模式的了解已經(jīng)足夠多了,但究竟你自己了解的程度到底怎樣呢?下面這篇文章主要給大家介紹了關(guān)于Java中單例模式的七種寫法,需要的朋友可以參考下
    2021-09-09
  • Java實(shí)現(xiàn)支付對接常用加密方式的示例代碼

    Java實(shí)現(xiàn)支付對接常用加密方式的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)支付對接時常用加密方式,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一點(diǎn)幫助,需要的可以參考一下
    2023-02-02
  • SpringBoot整合neo4j使用詳解

    SpringBoot整合neo4j使用詳解

    這篇文章將和大家詳細(xì)聊聊如何在springboot應(yīng)用中集成和使用neo4j,文中有詳細(xì)的實(shí)現(xiàn)流程和實(shí)例代碼,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • Java多線程編程中使用DateFormat類

    Java多線程編程中使用DateFormat類

    這篇文章主要介紹了Java多線程編程中使用DateFormat類,文中介紹了三種相關(guān)的并發(fā)使用方法,需要的朋友可以參考下
    2015-07-07
  • Springboot整合quartz實(shí)現(xiàn)多個定時任務(wù)實(shí)例

    Springboot整合quartz實(shí)現(xiàn)多個定時任務(wù)實(shí)例

    這篇文章主要介紹了Springboot整合quartz實(shí)現(xiàn)多個定時任務(wù)代碼實(shí)例,Quartz?是一款功能強(qiáng)大的開源任務(wù)調(diào)度框架,幾乎可以集成到任何?Java?應(yīng)用程序中,Quartz?可用于創(chuàng)建簡單或復(fù)雜的任務(wù)調(diào)度,用以執(zhí)行數(shù)以萬計(jì)的任務(wù),需要的朋友可以參考下
    2023-08-08
  • Spring打包jar包時jsp頁面無法訪問問題解決

    Spring打包jar包時jsp頁面無法訪問問題解決

    這篇文章主要介紹了Spring打包jar包時jsp頁面無法訪問問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 淺談Java中的n種隨機(jī)數(shù)產(chǎn)生辦法

    淺談Java中的n種隨機(jī)數(shù)產(chǎn)生辦法

    眾所周知,隨機(jī)數(shù)是任何一種編程語言最基本的特征之一。而生成隨機(jī)數(shù)的基本方式也是相同的:產(chǎn)生一個0到1之間的隨機(jī)數(shù)??此坪唵?,但有時我們也會忽略了一些有趣的功能。
    2015-09-09

最新評論