@Autowired
@Autowired private UserService userService;
@Resource
@Resouce private UserService userService;2、区别
@Autowired:
-
spring注解
-
默认按照类型注入
-
如果想按照名称注入,需要结合@Qualifier使用
这种情况一般发生在:一个类,有多个实现类的时候,比如
接口
public interface InterfaceUser {
void test();
}
实现类A
@Service
public class ImplUserA implements InterfaceUser{
@Override
public void test() {
System.out.println("我是a");
}
}
实现类B
@Service
public class ImplUserB implements InterfaceUser{
@Override
public void test() {
System.out.println("我是b");
}
}
此时interfaceUser对应两个实现类,根据类型无法知道要注入的是A还是B,
需要使用Qualifier,指定注入的bean的名称(类名,首字母小写)
@Service
public class TestAutowired {
@Autowired
@Qualifier("implUserB")
private InterfaceUser interfaceUser;
public void test(){
interfaceUser.test();
}
}
@Resource:
-
jdk支持的注解
-
默认先按照名称找,名称找不到,会按照类型找
-
可以指定name,也可以指定type
-
当你指定name的时候,只会按照名称找,名称找不到就不会再根据类型找
同样的,一个类,两个实现类的时候,看下resouce怎么处理的
这种情况,会报错,先按照name:interfaceUser找,没找到之后,会再根据InterfaceUser类型找,此时会找到两个ImplUserA和ImplUserB,报错
@Service
public class TestAutowired {
@Resource
private InterfaceUser interfaceUser;
public void test(){
interfaceUser.test();
}
}
怎么解决呢?
- 可以修改属性名
@Service
public class TestAutowired {
@Resource
private InterfaceUser implUserA;
public void test(){
implUserA.test();
}
}
- 可以指定type
@Service
public class TestAutowired {
@Resource(type = ImplUserA.class)
private InterfaceUser interfaceUser;
public void test(){
interfaceUser.test();
}
}
- 可以指定name
@Service
public class TestAutowired {
@Resource(name = implUserA)
private InterfaceUser interfaceUser;
public void test(){
interfaceUser.test();
}
}
3、总结
| 对比项 | @Autowire | @Resource |
|---|---|---|
| 注解来源 | Spring注解 | JDK注解(JSR-250标准注解,属于J2EE) |
| 装配方式 | 优先按类型 | 优先按名称 |
| 属性 | required | name、type |
| 作用范围 | 字段、setter方法、构造器 | 字段、setter方法 |
推荐resource
-
resource注解是属于J2EE的,减小了与spring的耦合
-
用autowire,如果之后新增一个实现类时,要把原有所有autowire的地方进行修改,指定name,不然原有注入的地方会报错
用resource,只需给新增的类指定不一样的name即可
关注公众:臻大虾,分享更多java干货



