详细讲解@resource和@Autowired的区别

@Resource 和 @Autowired 都是用于依赖注入(Dependency Injection)的注解,常用于 Spring 框架中来自动装配 Bean,但它们有一些本质的区别和使用习惯上的差异 。下面从来源、注入方式、注入优先级、常见使用场景等角度进行详细对比和讲解:


一、基础介绍

注解 所属 说明
@Autowired Spring 提供(org.springframework.beans.factory.annotation.Autowired) 按类型(byType)自动注入
@Resource JDK 提供(javax.annotation.Resource) 按名称(byName)自动注入,JDK规范,更具有可移植性

二、核心区别

✅ 1. 注入方式不同

特性 @Autowired @Resource
默认注入方式 按类型(byType) 按名称(byName)
注入逻辑 如果容器中有多个相同类型的 Bean,可结合 @Qualifier 注解指定名称 会先按名称找 Bean,找不到再按类型找
是否可用于构造器 ✅支持构造器注入 ❌不支持(只能用于字段或 setter)

举例:

java 复制代码
@Component
public class UserService {
    @Autowired
    private UserRepository userRepository; // 按类型注入
}
java 复制代码
@Component
public class UserService {
    @Resource
    private UserRepository userRepository; // 按名称注入,默认名字是"userRepository"
}

✅ 2. 是否支持 @Qualifier

  • @Autowired 支持与 @Qualifier("beanName") 配合使用,明确指定注入哪个 Bean。
  • @Resource 不支持 @Qualifier,但可以通过 @Resource(name="beanName") 指定 Bean 名称。
java 复制代码
@Autowired
@Qualifier("myBean")
private MyService service; // 指定使用名为 myBean 的 Bean
java 复制代码
@Resource(name="myBean")
private MyService service; // 同样指定使用 myBean

✅ 3. 是否必须依赖注入成功

注解 是否默认必须注入成功
@Autowired 是(可以设置 required = false)
@Resource 是(不能设置为非必须)
java 复制代码
@Autowired(required = false)
private MyBean optionalBean;

三、使用建议与最佳实践

场景 推荐注解 理由
Spring 项目中常规使用 @Autowired 更灵活,支持构造器注入,支持 @Qualifier
跨平台或非 Spring 项目 @Resource JSR-250 标准,更具有可移植性
注入第三方组件 @Autowired 结合 @Qualifier 更强大
注入单一 Bean,名称和属性一致 @Resource 简洁直接

四、实战对比举例

多个同类型 Bean 的情况

java 复制代码
@Component("cat")
public class Cat implements Animal {}

@Component("dog")
public class Dog implements Animal {}

@Component
public class Zoo {

    // 方式一:按类型 + @Qualifier
    @Autowired
    @Qualifier("dog")
    private Animal animal;

    // 方式二:按名称
    @Resource(name = "dog")
    private Animal animal;
}

五、总结对比表

特性 @Autowired @Resource
提供方 Spring JDK(JSR-250规范)
默认注入方式 按类型 按名称
支持构造器注入 ✅ ❌
是否支持 @Qualifier ✅ ❌(但可用 name)
是否可选注入 ✅(通过 required=false) ❌
可移植性 依赖 Spring 更高,可用于其他容器

六、总结一句话

@Autowired 更适用于 Spring 环境,功能更强大;
@Resource 遵循 JSR 标准,按名称注入,更适合简单场景或跨平台代码。

相关推荐
ZhengEnCi6 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
王中阳Go7 小时前
后端转 Agent 岗面试怎么答:8 个高频问题与应答口径
人工智能·后端·python·大语言模型
程序猿DD7 小时前
OctaFuse Gateway 2.18.0:MCP 接入支持 OAuth,供应商粘性绑定可视化管理
后端
ZhengEnCi8 小时前
Agent 规则管理:让 Memory 做索引、让 Skill 存规则——上下文上限实测与分工方案
后端
nice_lcj5209 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
骑着蜗牛撵大象3279 小时前
2026 后端 AI 工程化:Spring AI 管调用、MCP 管工具、Agent 内嵌管自治
java·人工智能·后端·spring·ai·可观测性·mcp
摸爬滚打的小李10 小时前
Spring XML + WAR + Tomcat 项目启动
后端
IT_陈寒11 小时前
SpringBoot自动配置的坑,这次终于爬出来了
前端·人工智能·后端
RainbowFish11 小时前
# RAG 与智能体记忆:从原理到工程实践 > 一篇给学习者的总结。
后端
苏三说技术12 小时前
为什么越来越多人用Arthas 4 ?
后端