区别
@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
其实我一直想知道用它俩哪个更好一点,但是经过我次实验,貌似用起来区别真的不是很大
以上是我读了一些文章的一个小结论吧,如有纰漏,欢迎大家指出。