@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


其实我一直想知道用它俩哪个更好一点,但是经过我次实验,貌似用起来区别真的不是很大

以上是我读了一些文章的一个小结论吧,如有纰漏,欢迎大家指出。

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