文章目录
-
-
- 一、基本概念:到底是什么?
- [二、@Autowired 的工作方式](#二、@Autowired 的工作方式)
-
- [Required 属性](#Required 属性)
- [三、@Resource 的工作方式](#三、@Resource 的工作方式)
- [四、@Autowired vs. @Resource 的区别一览](#四、@Autowired vs. @Resource 的区别一览)
- 五、如何选择?
- 六、总结
- 推荐阅读文章
-
在 Spring 的世界里,依赖注入无疑是核心之一,而 @Autowired
和 @Resource
则是两个使用频率极高的注解。它们看似相似,但实际用法和行为却有许多不同。今天,我们来深入探讨它们的差异,让你在项目中更精准地使用它们。
一、基本概念:到底是什么?
- @Autowired:是 Spring 框架提供的注解,用于自动装配 Bean。其默认按类型(byType)装配,并且在无法唯一匹配时,会再按 Bean 的名称进行装配。
- @Resource:则是来自 Java 的 JSR-250 标准(Java EE 注解),通常在 Spring 环境中也被支持。默认按名称(byName)装配,找不到匹配时则按类型。
二、@Autowired 的工作方式
@Autowired
注解的魅力在于其灵活的自动装配方式。当需要注入一个 Bean 时,@Autowired
会首先按类型寻找合适的 Bean。当存在多个同类型 Bean 时,若没有额外说明,Spring 将会报错。但可以通过加上 @Qualifier
指定 Bean 名称来解决:
java
@Autowired
@Qualifier("mySpecificBean")
private MyService myService;
Required 属性
@Autowired
默认是"强制装配",即 required=true
。若没有找到匹配的 Bean,则会抛出异常。但我们可以通过将 required
设置为 false
,来允许没有找到 Bean 时不注入:
java
@Autowired(required = false)
private Optional<MyService> myService;
通过 Optional
类型,能够更优雅地处理 Bean 的缺失。
三、@Resource 的工作方式
与 @Autowired
不同,@Resource
默认是按名称注入。它会优先寻找与属性名一致的 Bean 名称,如果找不到,则按类型注入。这种按名称优先的特性在实际使用中可以带来更多控制:
java
@Resource(name = "mySpecificBean")
private MyService myService;
如果名称没有指定,Spring 会直接根据属性名查找与之对应的 Bean。例如,如果属性是 myService
,它会尝试找到名称为 myService
的 Bean。
四、@Autowired vs. @Resource 的区别一览
特性 | @Autowired | @Resource |
---|---|---|
来源 | Spring 特有 | JSR-250 标准(Java EE) |
默认装配方式 | 按类型(byType) | 按名称(byName) |
兼容性 | 仅限 Spring 环境 | Java 标准,更广泛兼容 |
Required 属性 | 支持 required |
不支持 required |
装配精细化控制 | 配合 @Qualifier 使用 |
可通过 name 属性指定名称 |
五、如何选择?
- 如果你的项目完全基于 Spring,并希望更自由地按类型注入,
@Autowired
是更好的选择。 - 若项目有可能需要兼容 Java EE 标准,或需要严格的按名称注入,
@Resource
更符合需求。
六、总结
在 Spring 中,@Autowired
和 @Resource
提供了不同的依赖注入风格。合理使用它们,可以帮助我们写出更加灵活、可维护的代码。理解它们的区别,将让你在项目中更加游刃有余!
推荐阅读文章
- 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)
- 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系
- HTTP、HTTPS、Cookie 和 Session 之间的关系
- 什么是 Cookie?简单介绍与使用方法
- 什么是 Session?如何应用?
- 使用 Spring 框架构建 MVC 应用程序:初学者教程
- 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
- 如何理解应用 Java 多线程与并发编程?
- 把握Java泛型的艺术:协变、逆变与不可变性一网打尽
- Java Spring 中常用的 @PostConstruct 注解使用总结
- 如何理解线程安全这个概念?
- 理解 Java 桥接方法
- Spring 整合嵌入式 Tomcat 容器
- Tomcat 如何加载 SpringMVC 组件
- "在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?"
- "避免序列化灾难:掌握实现 Serializable 的真相!(二)"
- 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)
- 解密 Redis:如何通过 IO 多路复用征服高并发挑战!
- 线程 vs 虚拟线程:深入理解及区别
- 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别
- 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!
- "打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!"
- Java 中消除 If-else 技巧总结
- 线程池的核心参数配置(仅供参考)
- 【人工智能】聊聊Transformer,深度学习的一股清流(13)
- Java 枚举的几个常用技巧,你可以试着用用