• 浅谈 @Autowired 和 @Resource 的区别


    前言

    写过Spring框架的同学应该都知道,Spring当中使用字段注入的时候既可以用 @Autowired 又可以用 @Resource,但是当我使用 @Autowired,idea会提示我说,不建议使用字段注入:

    但如果我用的是 @Resource,就不会有这样的提示:

    于是在好奇心的驱使下,我探究了一下他们两者的区别,并了解了为什么idea会对 @Autowired 发出弱警告,在这里分享给大家。

    默认注入方式不同

    1. @Autowired 默认的注入方式为byType(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入 Bean (接口的实现类),如果想要指定名称,可以通过 @Qualifier 配合使用。

      1. @Autowired
      2. private UserSafetyMapper userSafetyMapper;
      3. // 或
      4. @Autowired @Qualifier("userSafetyMapper")
      5. private UserSafetyMapper userSafetyMapper;
      6. 复制代码
    2. @Resource 默认注入方式为 byName(根据命名进行匹配)。如果无法通过名称匹配到对应的实现类的话,注入方式会变为byType。

      • 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常;
      • 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常;
      • 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常;
      • 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
      1. // 1.默认注入方式
      2. @Resource
      3. private UserSafetyMapper userSafetyMapper;
      4. // 2.指定注入方式
      5. @Resource(name = "userSafetyMapper", type = UserSafetyMapper.class)
      6. private UserSafetyMapper userSafetyMapper;
      7. 复制代码

    提供者不同

    @Autowired 是spring提供的注解,@Resource 是JDK提供的注解。其实这也是为什么idea会对 @Autowired 发出警告,而不会对@Resource发出警告的原因。


    根据我查阅的一些资源和一点个人理解,得出以下分析:

    @Autowired 是Spring提供的,它只能适用于Spring,是特定IOC提供的特定注解,这就导致了程序和框架的强耦合,一旦换用了其他的IOC框架,就会导致失效,无法支持注入。而 @Resource 是Java提供的一种标准,一般的IOC容器应该去主动对 @Resource 做兼容,这样我们即使换了其他的框架,也可以正常使用字段注入的功能。

    不过话又说回来,我们在搭建一个项目的时候,刚开始选好框架了,以后很大可能就不会再去更换为其他的框架了,即使字段注入松耦合了,但其实还有其他更多的东西需要去修改,所以我个人认为用这两个都可以,具体使用哪个还得看公司的编码规范,个人项目的话,统一使用一个就好了。

  • 相关阅读:
    Singleton Pattern 单例模式简介与 C# 示例【创建型】【设计模式来了】
    为什么你的小红书笔记总是没有什么阅读量?
    解决使用mitmprox抓包可以访问网页,但是使用python request 调用该网站接口报错问题
    【第20例】华为 IPD 体系 | IPD 的底层思考逻辑(限制版)
    Arduino + ESP32-C3 + TFT(1.8‘ ST7735S)基础平台(实验三)折腾 TFT_eSPI 库
    基于Java实现的Lex词法分析器
    第十三届蓝桥杯大赛软件赛国赛B组C/C++(个人题解)
    ITSS认证系统运维范围定义
    华清远见11.2
    计算机组成原理---第五章中央处理器---控制器的功能和工作原理
  • 原文地址:https://blog.csdn.net/BASK2311/article/details/127664500