溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring中@Autowired和@Resource的區(qū)別是什么

發(fā)布時(shí)間:2022-08-29 16:57:00 來源:億速云 閱讀:128 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Spring中@Autowired和@Resource的區(qū)別是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Spring中@Autowired和@Resource的區(qū)別是什么”吧!

    @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)行查找,它的具體查找流程如下:

    Spring中@Autowired和@Resource的區(qū)別是什么

    關(guān)于以上流程,可以通過查看 Spring 源碼中的

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

    Spring中@Autowired和@Resource的區(qū)別是什么

    2.2 @Resource 查找順序

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

    Spring中@Autowired和@Resource的區(qū)別是什么

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

    Spring中@Autowired和@Resource的區(qū)別是什么

    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ù)如下圖所示:

    Spring中@Autowired和@Resource的區(qū)別是什么

    Spring中@Autowired和@Resource的區(qū)別是什么

    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ò)誤:

    Spring中@Autowired和@Resource的區(qū)別是什么

    5.編譯器提示不同

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

    Spring中@Autowired和@Resource的區(qū)別是什么

    雖然 IDEA 會(huì)出現(xiàn)報(bào)錯(cuò)信息,但程序是可以正常執(zhí)行的。

    然后,我們?cè)?strong>將依賴注入的注解更改為 @Resource 就不會(huì)出現(xiàn)報(bào)錯(cuò)信息了,具體實(shí)現(xiàn)如下:

    Spring中@Autowired和@Resource的區(qū)別是什么

    感謝各位的閱讀,以上就是“Spring中@Autowired和@Resource的區(qū)別是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Spring中@Autowired和@Resource的區(qū)別是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI