• Bean注入方式:@Autowired、@Resource的区别


    @Autowired 和 @Resource 的区别是什么?

    @Autowired 属于 Spring 内置的注解,默认的注入方式为 byType(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入 Bean (接口的实现类)。

    这会有什么问题呢?当一个接口存在多个实现类的话,byType 这种方式就无法正确注入对象了,因为这个时候 Spring 会同时找到多个满足条件的选择,默认情况下它自己不知道选择哪一个。

    这种情况下,注入方式会变为 byName(根据名称进行匹配),这个名称通常就是类名(首字母小写)。下面代码中的 smsService 就是我这里所说的名称。

    @Autowired
    private SmsService smsService;
    
    • 1
    • 2

    举个例子,SmsService 接口有两个实现类: SmsServiceImpl1SmsServiceImpl2,且它们都已经被 Spring 容器所管理。

    // 例1:报错,byName 和 byType 都无法匹配到 bean
    @Autowired
    private SmsService smsService;
    
    // 例2:正确注入 SmsServiceImpl1 对象对应的 bean
    @Autowired
    private SmsService smsServiceImpl1;
    
    // 例3:正确注入 SmsServiceImpl1 对象对应的 bean
    // smsServiceImpl1 就是我们上面所说的名称
    @Autowired
    @Qualifier(value = "smsServiceImpl1")
    private SmsService smsService;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    我们还是建议通过 @Qualifier 注解来显示指定名称而不是依赖变量的名称。

    @Resource属于 JDK 提供的注解,默认注入方式为 byName。如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType

    @Resource 有两个比较重要且日常开发常用的属性:name(名称)、type(类型)。

    public @interface Resource {
        String name() default "";
        Class<?> type() default Object.class;
    }
    
    • 1
    • 2
    • 3
    • 4

    如果仅指定 name 属性则注入方式为 byName,如果仅指定 type 属性则注入方式为 byType,如果同时指定 nametype 属性(不建议这么做)则注入方式为 byType + byName

    // 报错,byName 和 byType 都无法匹配到 bean,因为此时有两个实现类
    @Resource
    private SmsService smsService;
    
    // 正确注入 SmsServiceImpl1 对象对应的 bean
    @Resource
    private SmsService smsServiceImpl1;
    
    // 正确注入 SmsServiceImpl1 对象对应的 bean(比较推荐这种方式)
    @Resource(name = "smsServiceImpl1")
    private SmsService smsService;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    简单总结一下:

    • @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。
    • @Autowired 默认的注入方式为byType(根据类型进行匹配),@Resource默认注入方式为 byName(根据名称进行匹配)。
    • 当一个接口存在多个实现类的情况下,@Autowired@Resource 都需要通过名称才能正确匹配到对应的 Bean。Autowired 可以通过 @Qualifier 注解来显示指定名称,@Resource可以通过 name 属性来显示指定名称。

    参考:

    1. Spring中@Autowired和@Resource的区别
    2. @Autowired和@Resource的区别
  • 相关阅读:
    2023数维杯国际数学建模竞赛C题思路+代码+模型+论文
    TDesign:腾讯的企业级前端框架,对标elementUI和ant-design
    “一键替换视频封面,高效批量剪辑从未如此简单
    使用labelme打标签,详细教程
    看界面控件DevExpress WinForms如何创建一个虚拟键盘
    R Markdown 格式
    泛型的类型擦除后,fastjson反序列化时如何还原?
    音频存储格式wav介绍与解析
    剑指offer——JZ34 二叉树中和为某一值的路径(二) 解题思路与具体代码【C++】
    【计算机网络】数据链路层
  • 原文地址:https://blog.csdn.net/weixin_43987408/article/details/133691670