依赖注入之@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原生的.
源码方面
有兴趣的可以自己看一下, 我暂时没到这个深度~
标签:依赖,Resource,String,Autowired,Common,test,return,public From: https://www.cnblogs.com/codeInk/p/Autowired-vs-Resource.html