个人理解,其实没太必要死磕什么“byName”“byType”,我看过很多大佬做测试,@Autowired、 @Resource这俩都有根据类型、名称的功能。
说说区别,个人总结:
共同点
在接口仅有单一实现类时,可以替换。
不同点
-
@Resource是Java自己的注解
-
@Autowired是spring的注解
-
多个实现类时,
-
@Resource启动报错
...expected single matching bean but found 2:...
-
构造注入和@Autowired会提示 “检测到多个bean”,提示我们加上
@Qualifier("要引用的实现类bean名称")
-
定义个接口people,实现类俩boy、girl (一个实现类上面的方式通用就不讨论了)
代码写一块了,简单看看
/**
* @author 张童学
* @version 1.0
* @date 2022/5/11 15:43
* @describe
*/
public interface People {
String say();
}
/**
* @author 张童学
* @version 1.0
* @date 2022/5/11 15:43
* @describe
*/
@Service
public class Girl implements People{
@Override
public String say() {
return "girl";
}
}
/**
* @author 张童学
* @version 1.0
* @date 2022/5/11 15:43
* @describe
*/
@Service
public class Boy implements People{
@Override
public String say() {
return "boy";
}
}
用@Resource得加上(name = "boy")
@RestController
public class TestController {
@Resource(name = "boy")
People people;
@GetMapping("/aa")
public String test01() {
return people.say();
}
}
不然会
用@Autowired 得加上@Qualifier("目标实现类名")
@RestController
public class TestController {
@Qualifier("boy")
@Autowired
People people;
@GetMapping("/aa")
public String test01() {
return people.say();
}
}
不然会
用构造器 得在构造器参数前加上@Qualifier("目标实现类名")
@RestController
public class TestController {
private People people;
public TestController(@Qualifier("boy") People people) {
this.people = people;
}
@GetMapping("/aa")
public String test01() {
return people.say();
}
}
不然会
最后这种方式我们项目中一直在用,我大佬说这个更好其实,我听他的(狗头)。。。
其实这些很基础的东西,网上敲多解释贴,看着很乱,我觉得知道用法和大概的特点就行了,纠结原理不适合每个人。
(强烈推荐idea开发,超级好用真的,我们前后端都是用idea跑的,就很奶思。)