详细讲解@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 标准,按名称注入,更适合简单场景或跨平台代码。

相关推荐
小陈工30 分钟前
Python Web开发入门(十一):RESTful API设计原则与最佳实践——让你的API既优雅又好用
开发语言·前端·人工智能·后端·python·安全·restful
小阳哥AI工具35 分钟前
Seedance 2.0使用真人参考图生成视频的方法
后端
IeE1QQ3GT1 小时前
使用ASP.NET Abstractions增强ASP.NET应用程序的可测试性
后端·asp.net
Full Stack Developme2 小时前
SpringBoot多线程池配置
spring boot·后端·firefox
sxhcwgcy3 小时前
SpringBoot 使用 spring.profiles.active 来区分不同环境配置
spring boot·后端·spring
稻草猫.5 小时前
Spring事务操作全解析
java·数据库·后端·spring
希望永不加班6 小时前
SpringBoot 整合 MongoDB
java·spring boot·后端·mongodb·spring
Lzh编程小栈6 小时前
数据结构与算法之队列深度解析:循环队列+C 语言硬核实现 + 面试考点全梳理
c语言·开发语言·汇编·数据结构·后端·算法·面试
妙蛙种子3116 小时前
【Java设计模式 | 创建者模式】工厂方法模式
java·后端·设计模式·工厂方法模式
freejackman8 小时前
Java从0到1---基础篇
java·开发语言·后端·idea