依赖注入之@Autowired和@Resource的区别
依赖注入即由容器动态的将对象的依赖注入到该对象中
–这是Spring的几个核心特性之一
在使用的时候, 一般默认使用
@Autowired
注解, 但是其实根据场景还可以使用@Resourse
注解, 那么这俩注解有什么区别呢?
作用方式不一样
@Autowired
注解是通过tag
的方式进行匹配的, 因此在注入接口(实际是接口实现类)时, 需要存在一对一的关系,也就是一个接口只能由一个实现类, 否则就会报错.
@Resource
注解是通过name
的方式进行注入的, 因此在注入接口时, 会根据名称匹配对应的实现类, 具体可以参照下面的代码:
接口以及实现类:
public interface Common {
public String test();
}
@Service
public class A implements Common {
@Override
public String test() {
return "this is A!!!";
}
}
@Service
public class B implements Common {
@Override
public String test() {
return "this is B!!!";
}
}
测试Controller
@RestController
public class TestController {
@Resource
private Common a;
@Resource
private Common b;
@RequestMapping("/test")
public String test(){
return a.test();
}
@RequestMapping("/test2")
public String test2(){
return b.test();
}
}
可以看到注入同一个接口的时候, 可以根据不同的名称a
,b
去匹配到Common的不同实现类
而这套代码如果使用@Autowired
注解则会报错! 除非结合其他方式进行匹配, 例如可以结合@Qualify("")
以及@Service("")
,代码如下:
接口实现类:
@Service("A")
public class A implements Common {
@Override
public String test() {
return "this is A!!!";
}
}
@Service("B")
public class B implements Common {
@Override
public String test() {
return "this is B!!!";
}
}
测试Controller
@RestController
public class TestController {
@Autowired
@Qualifier("A")
private Common a;
@Autowired
@Qualifier(value = "B")
private Common b;
@RequestMapping("/test")
public String test(){
return a.test();
}
@RequestMapping("/test2")
public String test2(){
return b.test();
}
}
但是这种情况下, 是进行匹配@Service
中写的值进行匹配的, 也不是根据实现类的名称~
来源不一样
这个, 其实在导包的时候, 注意一下就能发现, @Autowired
注解是Spring写的注解, 而@Resource则是Java原生的.
源码方面
有兴趣的可以自己看一下, 我暂时没到这个深度~
原文地址:http://www.cnblogs.com/codeInk/p/Autowired-vs-Resource.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性