栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@Autowired、 @Resource 与构造方法注入

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@Autowired、 @Resource 与构造方法注入

个人理解,其实没太必要死磕什么“byName”“byType”,我看过很多大佬做测试,@Autowired、 @Resource这俩都有根据类型、名称的功能。

说说区别,个人总结: 共同点

在接口仅有单一实现类时,可以替换。

不同点
  • @Resource是Java自己的注解

  • @Autowired是spring的注解

  • 多个实现类时,

    • @Resource启动报错

    ...expected single matching bean but found 2:...

    • 构造注入和@Autowired会提示 “检测到多个bean”,提示我们加上

    @Qualifier("要引用的实现类bean名称")

定义个接口people,实现类俩boy、girl (一个实现类上面的方式通用就不讨论了)
代码写一块了,简单看看


public interface People {
   String say();
}


@Service
public class Girl implements People{
    @Override
    public String say() {
        return "girl";
    }
}


@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跑的,就很奶思。)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/878513.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号