线上工单引发的思考:Spring Boot 中 @Autowired 与 @Resource 的区别

最近接手了离职同事负责的业务,在处理一个线上工单的时候,看了下历史逻辑,在阅读他们写的代码时,发现他们竟然把@Autowired和@Resource注解混用。今天就借此机会聊聊SpringBoot项目中这两者之间的区别。

1. 注解来源

  • @Autowired:是Spring框架提供的注解。IOC特性的核心注解之一。
  • @Resource:是Java的标准注解,属于Java EE 规范(JSR-250)。

2. 注入方式

  • @Autowired:默认按类型进行注入。如果业务场景比较复杂,一个接口有多个实现类的话,可以结合@Qualifier注解指定具体的bean。如:
java 复制代码
@Service
public class SomeService {
    @Autowired
    @Qualifier("userServiceImpl1")
    private UserService userService1;
    
    @Autowired
    @Qualifier("userServiceImpl2")
    private UserService userService2;
    // 业务逻辑
}
  • @Resource:默认按名称进行注入,即name属性。如果name属性没有指定,则按类型进行注入。
java 复制代码
@Service
public class SomeService {
    @Resource
    private UserService userService;
    // 业务逻辑
}

在这种情况下,Spring 会尝试查找名称为 userService 的 bean。如果找不到按名称匹配的 bean,它会再尝试按类型进行匹配。如果按类型匹配也找不到唯一的 bean,就会抛异常。

用一句话总结就是:@Autowired相当于是@Resource的子集

3. 依赖检查

  • @Autowired :默认情况下,它要求依赖的 bean 必须存在于容器中 。如果找不到匹配的 bean,Spring 会抛出 NoSuchBeanDefinitionException 异常。可以通过将 required 属性设置为 false 来改变这种行为,使依赖变为可选的,这个时候注入的bean就是null。如:
java 复制代码
@Service
public class SomeService {
    @Autowired(required = false)
    private UserService userService;
    // 业务逻辑
}
  • @Resource:没有类似 required 这样明确的属性来控制依赖是否必须存在。当按名称或者类型无法找到匹配的 bean 时,会抛出NameNotFoundException 或 NullPointerException 异常。

4. 使用场景选择

  • @Resource
    更适合在需要严格按名称注入的场景下使用。
    在 Java EE 环境中更常见,因为它符合 Java EE 标准。
  • @Autowired
    是 Spring 生态系统中最常用的依赖注入方式。对于 Spring 生态系统的开发者来说,使用频次很高。特别是在处理复杂的依赖关系和需要灵活配置的场景下,通过结合 @Qualifier 注解,可以实现精准的依赖注入。

当然,本人也更喜欢使用@Autowired。

相关推荐
虾说羊5 分钟前
Spring Boot前后端分离项目部署
java·spring boot·后端
vx_bisheyuange21 分钟前
基于SpringBoot的青年公寓服务平台
前端·vue.js·spring boot·毕业设计
小王不爱笑13226 分钟前
SpringBoot 项目新建的五种方式详细笔记
spring boot·笔记·后端
superman超哥29 分钟前
Rust 内存泄漏检测与防范:超越所有权的内存管理挑战
开发语言·后端·rust·内存管理·rust内存泄漏
愤怒的代码35 分钟前
从开发调试到生产上线:全维度 Android 内存监控与分析体系构建
android·java·kotlin
悟能不能悟42 分钟前
java HttpServletRequest 设置header
java·开发语言
悟空码字1 小时前
SpringBoot整合FFmpeg,打造你的专属视频处理工厂
java·spring boot·后端
独自归家的兔1 小时前
Spring Boot 版本怎么选?2/3/4 深度对比 + 迁移避坑指南(含 Java 8→21 适配要点)
java·spring boot·后端
郝学胜-神的一滴1 小时前
线程同步:并行世界的秩序守护者
java·linux·开发语言·c++·程序人生
superman超哥1 小时前
Rust 移动语义(Move Semantics)的工作原理:零成本所有权转移的深度解析
开发语言·后端·rust·工作原理·深度解析·rust移动语义·move semantics