@Resource 與 @Autowired 的區別與聯繫

區別

@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


其實我一直想知道用它倆哪個更好一點,但是經過我次實驗,貌似用起來區別真的不是很大

以上是我讀了一些文章的一個小結論吧,如有紕漏,歡迎大家指出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章