@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ò)誤。