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

embedded/2025/1/19 18:47:55/

最近接手了离职同事负责的业务,在处理一个线上工单的时候,看了下历史逻辑,在阅读他们写的代码时,发现他们竟然把@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 {@Resourceprivate 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。


http://www.ppmy.cn/embedded/155292.html

相关文章

Asp.Net Core 8.0 使用 Serilog 按日志级别写入日志文件的两种方式

1、所需的Nuget包 本文项目的版本是.NET 8.0,如果使用其它版本安装适配版本即可。 Serilog.AspNetCore(8.0.2) Serilog.Sinks.File(5.0.0) Serilog.Expressions(5.0.0) 2、两种配置方式 2.1 代码形式(Program.cs) 在Program.cs文件中&am…

rabbitmq安装延迟队列

在RabbitMQ中,延迟队列是一种特殊的队列类型。当消息被发送到此类队列后,不会立即投递给消费者,而是会等待预设的一段时间,待延迟期满后才进行投递。这种队列在多种场景下都极具价值,比如可用于处理需要在特定时间触发…

Uniapp判断设备是安卓还是 iOS,并调用不同的方法

在 UniApp 中,可以通过 uni.getSystemInfoSync() 方法来获取设备信息,然后根据系统类型判断当前设备是安卓还是 iOS,并调用不同的方法。 示例代码 export default {onLoad() {this.checkPlatform();},methods: {checkPlatform() {// 获取系…

SQL刷题快速入门(三)

其他章节: SQL刷题快速入门(一) SQL刷题快速入门(二) 承接前两个章节,本系列第三章节主要讲SQL中where和having的作用和区别、 GROUP BY和ORDER BY作用和区别、表与表之间的连接操作(重点&…

【Docker】——安装Docker以及解决常见报错

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

C# 开发aspx文件中js获取<asp:label>的数值

想要实现功能&#xff1a;依据窗口的某些参数&#xff0c;打开新窗口来展示其详细信息。 尝试了以下的三种方法&#xff0c;最终还是选择了【第一种】&#xff0c;剩下两种没有实现。 一、通过<a>标签的方式 在合适的位置&#xff0c;通过<a οnclick"OpenDet…

在 JIRA 中利用仪表盘功能生成 Bug 相关图表的手册

引言 JIRA 是 Atlassian 推出的项目管理工具&#xff0c;广泛应用于软件开发、团队协作和问题跟踪。对于开发团队和项目经理而言&#xff0c;能够清晰地了解当前 Bug 状态、优先级分布及进展情况至关重要。JIRA 提供了强大的 仪表盘功能&#xff0c;让用户能够通过各种图表直观…

haproxy+httpd网站架构,实现负载均衡实验笔记

前提准备&#xff1a; 两台httpd&#xff0c;一台haproxy&#xff0c;NFS部署在任意一台httpd上http1&#xff1a;192.168.180.110http2&#xff1a;192.168.180.120&#xff0c;NFShaproxy&#xff1a;192.168.180.100 http&#xff08;两台httpd的操作是一样的&#xff09;…