autowired在什么条件下可以使用(一文读懂Autowired和Resource的区别)
autowired在什么条件下可以使用(一文读懂Autowired和Resource的区别)@Service publicclassTestAutowired{ @Resource privateInterfaceUserimplUserA; publicvoidtest(){ implUserA.test(); } } 可以指定type@Service publicclassTestAutowired{ @Resource(type=ImplUserA.class) privateInterfaceUserinterfaceUser; publicvoidtest(){ interfaceUser.test(); } } 可以指定name@Service publicclassTestAutowired{ @Resource(name=implUserA) privateInterfaceUserinterfaceUser; publicvoidtest(){ interfac
1、bean注入的注解@Autowired
@Autowired
privateUserServiceuserService;
@resource
@Resouce
privateUserServiceuserService;
2、区别
@Autowired:
- Spring注解
- 默认按照类型注入
- 如果想按照名称注入,需要结合@Qualifier使用
这种情况一般发生在:一个类,有多个实现类的时候,比如
接口
publicinterfaceInterfaceUser{
voidtest();
}
实现类A
@Service
publicclassImplUserAimplementsInterfaceUser{
@Override
publicvoidtest(){
System.out.println("我是a");
}
}
实现类B
@Service
publicclassImplUserBimplementsInterfaceUser{
@Override
publicvoidtest(){
System.out.println("我是b");
}
}
此时interfaceUser对应两个实现类,根据类型无法知道要注入的是A还是B,
需要使用Qualifier,指定注入的bean的名称(类名,首字母小写)
@Service
publicclassTestAutowired{
@Autowired
@Qualifier("implUserB")
privateInterfaceUserinterfaceUser;
publicvoidtest(){
interfaceUser.test();
}
}
@Resource:
- JDK支持的注解
- 默认先按照名称找,名称找不到,会按照类型找
- 可以指定name,也可以指定type
- 当你指定name的时候,只会按照名称找,名称找不到就不会再根据类型找
同样的,一个类,两个实现类的时候,看下resouce怎么处理的
这种情况,会报错,先按照name:interfaceUser找,没找到之后,会再根据InterfaceUser类型找,此时会找到两个ImplUserA和ImplUserB,报错
@Service
publicclassTestAutowired{
@Resource
privateInterfaceUserinterfaceUser;
publicvoidtest(){
interfaceUser.test();
}
}
怎么解决呢?
- 可以修改属性名
@Service
publicclassTestAutowired{
@Resource
privateInterfaceUserimplUserA;
publicvoidtest(){
implUserA.test();
}
}
- 可以指定type
@Service
publicclassTestAutowired{
@Resource(type=ImplUserA.class)
privateInterfaceUserinterfaceUser;
publicvoidtest(){
interfaceUser.test();
}
}
- 可以指定name
@Service
publicclassTestAutowired{
@Resource(name=implUserA)
privateInterfaceUserinterfaceUser;
publicvoidtest(){
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干货
你的支持是对我不断创作的极大鼓励,咱们下期见。