@Autowired 和 @Resource 有什么區(qū)別

@Autowired 和 @Resource 都是 Spring/Spring Boot 項(xiàng)目中,用來進(jìn)行依賴注入的注解。它們都提供了將依賴對(duì)象注入到當(dāng)前對(duì)象的功能,但二者卻有眾多不同,并且這也是常見的面試題之一,所以我們今天就來盤它。
@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 語(yǔ)言的規(guī)范或標(biāo)準(zhǔn)。
2.依賴查找順序不同
依賴注入的功能,是通過先在 Spring IoC 容器中查找對(duì)象,再將對(duì)象注入引入到當(dāng)前類中。而查找有分為兩種實(shí)現(xiàn):按名稱(byName)查找或按類型(byType)查找,其中 @Autowired 和 @Resource 都是既使用了名稱查找又使用了類型查找,但二者進(jìn)行查找的順序卻截然相反

2.3 查找順序小結(jié)
由上面的分析可以得出:

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

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);
    }
}

總結(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 個(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ò)誤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容