当前位置: 首页 > news >正文

【Java】Java 中 @Resource 与 @Autowired 的区别详解

请添加图片描述


文章目录

    • 一、前言
    • 二、两者的来源与定位
    • 三、共同点
    • 四、`@Autowired` 注入机制详解
      • 1. 按类型注入(byType)
      • 2. 当有多个同类型 Bean 时
      • 3. 解决方案
        • (1)使用 `@Qualifier` 指定 Bean 名称:
        • (2)使用 `@Primary` 标记优先 Bean:
      • 4. 支持构造器注入、Setter 注入、字段注入
      • 5. 支持 `required` 属性
    • 五、`@Resource` 注入机制详解
      • 1. 按名称注入(byName)
      • 2. 若找不到匹配名称,则按类型注入(byType)
      • 3. 可通过属性显式指定 Bean 名称
      • 4. 不支持 `@Primary` 和 `@Qualifier`
    • 六、注入顺序对比(核心差异)
    • 七、在 Spring Boot 中的推荐实践
    • 八、实践建议


一、前言

在 Spring 开发中,依赖注入(Dependency Injection, DI) 是最核心的特性之一。
当我们要把一个 Bean 自动注入到另一个类中时,经常会看到两种注解:

@Autowired
private UserService userService;
@Resource
private UserService userService;

它们看起来效果相同,但实际上存在底层机制与使用细节的差异
下面将深入剖析两者的区别与最佳实践。


二、两者的来源与定位

注解所属包引入规范依赖容器
@Autowiredorg.springframework.beans.factory.annotationSpring 框架Spring
@Resourcejakarta.annotation(或旧版 javax.annotationJSR-250 标准Java EE(兼容 Spring)

简而言之:

  • @AutowiredSpring 专属注解
  • @ResourceJava 官方标准注解

💡 Spring 同时支持两者,但其注入规则不同。


三、共同点

在功能层面,它们都用于实现 依赖自动注入(即不再手动 new 对象)。

示例:

@Service
public class OrderService {@Autowiredprivate UserService userService;public void createOrder() {userService.notifyUser();}
}

或使用 @Resource

@Service
public class OrderService {@Resourceprivate UserService userService;public void createOrder() {userService.notifyUser();}
}

两种方式都能正常工作。
但区别在于:当容器中存在多个同类型 Bean 时,它们的注入逻辑完全不同。


四、@Autowired 注入机制详解

1. 按类型注入(byType)

Spring 会优先根据 类型(Type) 查找匹配的 Bean:

@Autowired
private UserService userService;

如果容器中存在唯一的 UserService 类型 Bean,就能正常注入。


2. 当有多个同类型 Bean 时

@Service
public class UserServiceA implements UserService {}@Service
public class UserServiceB implements UserService {}@Autowired
private UserService userService; // ❌ 报错:NoUniqueBeanDefinitionException

此时 Spring 不知道该注入哪一个。


3. 解决方案

(1)使用 @Qualifier 指定 Bean 名称:
@Autowired
@Qualifier("userServiceA")
private UserService userService;

(2)使用 @Primary 标记优先 Bean:
@Service
@Primary
public class UserServiceA implements UserService {}

4. 支持构造器注入、Setter 注入、字段注入

@Autowired
public OrderService(UserService userService) {this.userService = userService;
}

或:

@Autowired
public void setUserService(UserService userService) {this.userService = userService;
}

推荐使用 构造器注入 —— 更利于单元测试与不可变设计。


5. 支持 required 属性

@Autowired(required = false)
private UserService userService;

如果容器中没有该 Bean,不会抛异常,而是注入 null


五、@Resource 注入机制详解

1. 按名称注入(byName)

@Resource 默认优先根据 字段名(Name) 查找 Bean。

@Resource
private UserService userService;

Spring 会首先尝试匹配 Bean 名称为 "userService" 的对象。


2. 若找不到匹配名称,则按类型注入(byType)

如果容器中没有 "userService" 这个 Bean 名称,Spring 会退而求其次,按类型注入。

⚠️ 若存在多个相同类型 Bean,会抛出 NoUniqueBeanDefinitionException


3. 可通过属性显式指定 Bean 名称

@Resource(name = "userServiceA")
private UserService userService;

这相当于 @Autowired + @Qualifier("userServiceA")


4. 不支持 @Primary@Qualifier

@Resource 是 Java 标准注解,不依赖 Spring 的扩展机制,因此不支持这两个注解。


六、注入顺序对比(核心差异)

步骤@Autowired@Resource
默认策略按类型注入(byType)按名称注入(byName)
是否支持 @Qualifier✅ 支持❌ 不支持
是否支持 @Primary✅ 支持❌ 不支持
是否可设置 required✅ 可选❌ 无此属性
是否依赖 Spring 框架✅ 是❌ 否(标准注解)
优先查找类型 → 名称名称 → 类型
使用包org.springframework.beans.factory.annotationjakarta.annotation
常见错误多个同类型 Bean 报错名称不匹配时报错

七、在 Spring Boot 中的推荐实践

场景推荐注解理由
纯 Spring 项目@AutowiredSpring 原生,功能更强
兼容 Jakarta / JavaEE 项目@Resource标准化,跨框架通用
有多个 Bean 需区分时@Autowired + @Qualifier精确控制
惰性加载或选填依赖@Autowired(required = false)更灵活

💡 Spring 官方文档推荐优先使用 @Autowired,除非需要兼容性或与非 Spring 框架交互。



八、实践建议

  1. 优先使用@Autowired(尤其在 Spring Boot 项目中);
  2. 当需要按名称注入时,使用:
@Autowired
@Qualifier("beanName")
  1. 若项目需要兼容 Jakarta EE 或第三方容器,可使用:
@Resource(name = "beanName")
  1. 避免在同一个项目中混用两者,以保持一致性;
  2. 推荐使用 构造器注入,提高可测试性与代码可维护性。

参考资料

面试突击78:@Autowired 和 @Resource 有什么区别?-阿里云开发者社区

http://www.dtcms.com/a/591227.html

相关文章:

  • 重庆招聘一般上什么网站金空间网站
  • 网站建设需要上传数据库吗专业的外贸网站建设公司
  • 谷歌认证合作伙伴网站建设顺德网站设计
  • 【MySQL | 基础】DDL语句以及数据类型
  • 电商网站的二级菜单怎么做广东深圳旅游必去十大景点
  • Flow Matching|什么是“预测速度场 vt=ε−x”?
  • 福田公司网站建设福田做棋牌网站建设多少钱
  • 网站开发交接协议书郑州做企业网站的
  • 佟年给韩商言做的网站郑州设计工作室
  • wordpress网站转app个人网站 可以做论坛吗
  • 网站数据库一般多大服务型网站建设
  • 做的网站第二年续费多钱软件ui设计师
  • 杭州做网站五代理注册公司怎么收费
  • 网站搜索不到公司网站用wordpress建站会不会显得水平差
  • 闽清网站建设临湘网站建设
  • 网站案例展示分类庭院景观设计
  • 学习网站免费微信营销网站
  • 棋牌网站哪里做2024营业执照年审官网入口
  • 网站开发及app开发报价网站建设层级图
  • 甘肃三北防护林建设局网站广州模板建站公司
  • 寮步做网站公司关于网站开发的引言
  • 搜索网站程序东莞网站建设五金建材
  • 企航互联提供天津网站建设什么是电子商务采购
  • 帝国怎么做网站tinypng图片压缩网站
  • 人防工程建设网站太原seo网站管理
  • 网站开发翻译插件网站需要怎么做才能被百度收录
  • 国家企业信用查询官网河南seo推广平台
  • 罗湖装修公司网站建设建设网站如何赢利
  • 卖保温杯去什么网站做推广wordpress 底部菜单
  • 做网编去网站还是工作室好wordpress 如何调试