@Resource vs @Autowired 在Spring中的使用和區別
在Spring開發中,我們常會接觸兩個用于實現引用模塊注入的注解:@Resource
和 @Autowired
。它們在使用上有些相似之處,但本質上來看,有所區別。本文將給出兩者的詳細介紹和對比,幫助你更好地了解和選擇適合的注入方式。
一. @Resource 注解介紹
@Resource
是來自 JSR-250 標準的注解,它旨在擴展 Java 對象管理和依賴注入的能力,常用于 Java EE 和 Spring 中。
@Resource
private UserService userService;
這里 userService
將被注入到 Spring 實體類中。
基本規則
- 按照 name 來匹配 Bean:如果指定了
name
屬性,Spring 會按名字搜索 Bean - 如果未指定 name,則默認會根據字段名來搜索 Bean
- 如果找不到名字匹配,則根據類型匹配
支持屬性
@Resource(name = "myService")
private MyService service;
二. @Autowired 注解介紹
@Autowired
是 Spring 提供的自動注入模型,通過 Spring IoC 實現由實體自動解析并注入相關類型。
@Autowired
private UserService userService;
這里 Spring 會根據 UserService
的類型解析 Bean 并進行注入。
基本規則
- 按照類型匹配,如果有多個 Bean 匹配,則根據
@Qualifier
指定 - 支持
required = false
,用于避免注入失敗時拋異常
@Autowired(required = false)
private UserService userService;
三. @Resource vs @Autowired
注解 | 來源 | 默認匹配規則 | 是否可配合 @Qualifier | 是否支持 required 屬性 |
---|---|---|---|---|
@Resource | JSR-250 | 先按 name,后按 type | 否 | 否 |
@Autowired | Spring | 先按 type,可配合 Qualifier 指定 name | 是 | 是 |
四. 實際示例對比
// 1. @Resource
@Resource(name = "myService")
private MyService service;// 2. @Autowired + @Qualifier
@Autowired
@Qualifier("myService")
private MyService service;
上面兩者效果相同,均指定名稱為 myService
的 Bean 注入到 service
。
五. 使用建議
- 如果考慮經濟性和與 Java EE 的兼容,可以使用
@Resource
- 如果對 Spring 依賴更強,需要類型強匹配和更多選項,選擇
@Autowired
- Spring Boot 環境下,推薦使用
@Autowired
,配合@Qualifier
六. 結論
@Resource
和@Autowired
同為實現引用注入功能的注解,但各自有優勢和適用場景。如果你需要更好的 Spring 組件化支持和類型編譯器提示,推薦使用 @Autowired
;如果需要與舊有 Java EE 系統兼容,則考慮 @Resource
。
英語學習圈:
- inject: 注入
- dependency: 依賴
- annotation: 注解
- qualifier: 限定器
- resolve: 解析,解決
- compatible: 兼容的
- behavior: 行為