@Autowired 和 @Resource 的区别

@Autowired 和 @Resource 的区别

@Autowired 和 @Resource 都是 Java 开发中用于实现依赖注入(DI)的常用注解,但它们在来源、装配规则和使用方式上有着本质的区别。

为了让你更直观地理解,以下是两者的核心区别对比:

区别维度 @Autowired @Resource
注解来源 Spring 框架特有 Java 官方标准(JSR-250)
默认装配规则 默认按类型(byType)注入 默认按名称(byName)注入
指定名称方式 需配合 @Qualifier("beanName") 使用 直接使用 name 属性,如 @Resource(name="beanName")
是否支持可选注入 支持 required=false(找不到 Bean 时不报错) 不支持,找不到 Bean 时会直接抛出异常
支持的注入位置 字段、Setter 方法、构造器 字段、Setter 方法(不支持构造器)

💡 核心差异深度解析

1. 来源与兼容性

  • @Autowired 是 Spring 框架的亲儿子,与 Spring 生态结合最紧密。
  • @Resource 是 Java 官方提供的标准注解(属于 JSR-250 规范)。它不依赖于 Spring,因此在跨框架(如 Jakarta EE)或需要降低与 Spring 耦合度的场景下,兼容性更好。

2. 查找与注入逻辑(最核心的区别)

  • @Autowired(先类型,后名称) :
    Spring 容器会先根据字段或参数的类型 去查找 Bean。如果找到唯一的一个,直接注入;如果找到多个同类型的 Bean,它会再根据字段名称 去匹配;如果依然匹配不上,就必须配合 @Qualifier 明确指定 Bean 的名称,否则会报错。
  • @Resource(先名称,后类型) :
    它会先根据名称 (默认是字段名,也可以通过 name 属性指定)去查找 Bean。如果按名称找不到,它才会降级去按类型查找。

3. 实际开发中的使用建议

  • 优先推荐使用 @Autowired :在纯粹的 Spring / Spring Boot 项目中,@Autowired 是最主流的选择。特别是配合构造器注入(Spring 4.3 后单构造器可省略该注解),能够更好地保证依赖的不可变性,且非常便于单元测试。
  • 特定场景使用 @Resource :当你需要严格按名称注入 ,或者项目中有多个同类型的 Bean 且不想引入 @Qualifier 时,直接使用 @Resource(name = "xxx") 会显得更加简洁直观。

⚠️ 最佳实践提醒:

在同一个项目中,建议保持依赖注入注解风格的统一,尽量避免 @Autowired 和 @Resource 混用,以保证代码的规范性和可维护性。


要不要我出几道小练习题,帮你巩固一下这两个注解在实际代码中的使用区别?

相关推荐
Eider199813 分钟前
python基础语法之并发基础练习
开发语言·python
长不大的杨瑞杰17 分钟前
OpenCode v2 LSP 实战:内置语言服务器、自定义配置与诊断闭环
java·人工智能·typescript·lsp·opencode
#麻辣小龙虾#18 分钟前
网页布局css中flex+margin的组合布局技巧
开发语言·前端·javascript
云和数据.ChenGuang21 分钟前
python和java的try
java·开发语言·python
我是唐青枫22 分钟前
Kotlin Inheritance(继承)详解:语法、原理、实战 Demo
开发语言·kotlin
日日大王学编程23 分钟前
阿里巴巴开源 Data Agent(Text2SQL)项目全维度详解
java·ai·开源
Wang's Blog26 分钟前
Java 项目实战:交友项目 - 交友左滑右滑
java·交友
测试盐29 分钟前
spark作业日志定位过程
java·hadoop·spark
ly768932 分钟前
从 OpenAPI 到多语言 SDK 生成:Java 服务端契约漂移与生成器版本治理
java·开发语言·openapi·java 21·版本兼容·契约漂移·sdk 生成
lqbzlll1 小时前
CVE-2026-91403 排查指南:Java JSSE 信任链漏洞的根因、影响范围和修复步骤
java·开发语言·信任链