招銀網絡一面:@Autowired 和 @Resource 的區(qū)別是什么?

下面是正文。
Spring 內置的?@Autowired?以及 JDK 內置的?@Resource?和?@Inject?都可以用于注入 Bean。
| Annotaion | Package | Source |
|---|---|---|
@Autowired | org.springframework.bean.factory | Spring 2.5+ |
@Resource | javax.annotation | Java JSR-250 |
@Inject | javax.inject | Java JSR-330 |
@Autowired?和@Resource使用的比較多一些。
Autowired?屬于 Spring 內置的注解,默認的注入方式為byType(根據類型進行匹配),也就是說會優(yōu)先根據接口類型去匹配并注入 Bean (接口的實現類)。
這會有什么問題呢??當一個接口存在多個實現類的話,byType這種方式就無法正確注入對象了,因為這個時候 Spring 會同時找到多個滿足條件的選擇,默認情況下它自己不知道選擇哪一個。
這種情況下,注入方式會變?yōu)?byName(根據名稱進行匹配),這個名稱通常就是類名(首字母小寫)。就比如說下面代碼中的?smsService?就是我這里所說的名稱,這樣應該比較好理解了吧。
//?smsService?就是我們上面所說的名稱
@Autowired
private?SmsService?smsService;
舉個例子,SmsService?接口有兩個實現類:?SmsServiceImpl1和?SmsServiceImpl2,且它們都已經被 Spring 容器所管理。
//?報錯,byName?和?byType?都無法匹配到?bean
@Autowired
private?SmsService?smsService;
//?正確注入?SmsServiceImpl1?對象對應的?bean
@Autowired
private?SmsService?smsServiceImpl1;
//?正確注入??SmsServiceImpl1?對象對應的?bean
//?smsServiceImpl1?就是我們上面所說的名稱
@Autowired
@Qualifier(value?=?"smsServiceImpl1")
private?SmsService?smsService;
我們還是建議通過?@Qualifier?注解來顯示指定名稱而不是依賴變量的名稱。
@Resource屬于 JDK 提供的注解,默認注入方式為?byName。如果無法通過名稱匹配到對應的實現類的話,注入方式會變?yōu)?code style="font-size: 14px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(41, 128, 185);background-color: rgba(27, 31, 35, 0.05);word-break: break-all;">byType。
@Resource?有兩個比較重要且日常開發(fā)常用的屬性:name(名稱)、type(類型)。
public?@interface?Resource?{
????String?name()?default?"";
????Class>?type()?default?Object.class;
}
如果僅指定?name?屬性則注入方式為byName,如果僅指定type屬性則注入方式為byType,如果同時指定name?和type屬性(不建議這么做)則注入方式為byType+byName。
//?報錯,byName?和?byType?都無法匹配到?bean
@Resource
private?SmsService?smsService;
//?正確注入?SmsServiceImpl1?對象對應的?bean
@Resource
private?SmsService?smsServiceImpl1;
//?正確注入?SmsServiceImpl1?對象對應的?bean(比較推薦這種方式)
@Resource(name?=?"smsServiceImpl1")
private?SmsService?smsService;
簡單總結一下:
@Autowired?是 Spring 提供的注解,@Resource?是 JDK 提供的注解。Autowired?默認的注入方式為byType(根據類型進行匹配),@Resource默認注入方式為?byName(根據名稱進行匹配)。當一個接口存在多個實現類的情況下, @Autowired?和@Resource都需要通過名稱才能正確匹配到對應的 Bean。Autowired?可以通過?@Qualifier?注解來顯示指定名稱,@Resource可以通過?name?屬性來顯示指定名稱。
··········? END? ··············
