區別
@Resouce
1、默認按照名字裝配bean(不寫名字,默認類的小駝峯),沒有匹配則返回一個原始類型
2、JSR-250提供的註解
3、可以指定:name 按名字裝配,type 按類型裝配
@Autowire
1、默認按類型注入 ,類型找不到也會按照名字掃描(如第4點)
2、spring的註解
3、@Qualifier(“userServiceImpl”) ,按照名字裝配,接口多實現的時候用
4、通過實例名是子類的小駝峯也可以實現子類注入
5、可能不存在的bean,@Autowired(required = false) ,不用就拋異常
實例
public interface Person {
Integer getAge();
}
@Service
public class PersonOne implements Person {
@Override
public Integer getAge() {
return 1;
}
}
@Service
public class PersonTwo implements Person {
@Override
public Integer getAge() {
return 2;
}
}
// --------- @Autowired的方式注入 ---------
// 注入子類方式一:對象名 = 子類名的小駝峯模式
@Autowired
private Person personOne;
// 注入子類方式二:使用 @Qualifier 註解
@Autowired
@Qualifier("personOne")
private Person person;
// 注入不一定存在的類
@Autowired(required = false)
private Person person;
// --------- @Resource的方式注入 ---------
@Resource(type = PersonTwo.class)
private Person person02;
@Resource(name = “personTwo”)
private Person person02;
三種bean的注入方式
1、直接注入
@Autowired
private Person person;
// 注入子類
@Autowired
private Person personOne;
這種方式注入,會得到idea的熱心警告,如下圖:
所以用下兩種更嚴謹一點
2、set方法注入
這種方式建議用 @Resource
註解
private Person person;
@Autowired
public void setPerson(Person person){
this.person = person;
}
// 通過接口注入子類
// ---------- @Autowired -------------
private Person person;
@Autowired
public void setPerson(@Qualifier("personOne")Person person){
this.person = person;
}
@Autowired
public void setPerson(Person personOne){
this.person = person;
}
// ---------- @Resource-------------
@Resource
public void setPerson(Person personOne){
this.person = person;
}
3、構造方法注入
public class Test{
private Person person;
private Boy boy;
@Autowired
public Test(Person person,Boy boy){
this.person = person;
this.boy = boy;
}
}
注意:以上示例,本人親測!
總結:
主要區別:默認的裝配方式不一樣,@Resource ≈ @Autowired + @Qualifier
一些小建議吧:
1、一個接口一個實現,使用 @Autowired 比較方便
2、一個接口多個實現,可以使用 @Resource,用起來比較方便
3、論速度的話,@Resource 比 @Autowired 快,根據名字類似於按照Id查詢
4、使用 setter方法注入的時候,建議使用 @Resource
其實我一直想知道用它倆哪個更好一點,但是經過我次實驗,貌似用起來區別真的不是很大
以上是我讀了一些文章的一個小結論吧,如有紕漏,歡迎大家指出。