Spring 中的 @Resource vs @Autowired 他的区别用法?

文章目录

在 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 提供了不同的依赖注入风格。合理使用它们,可以帮助我们写出更加灵活、可维护的代码。理解它们的区别,将让你在项目中更加游刃有余!


推荐阅读文章

相关推荐
李迟2 分钟前
Golang实践录:工程框架实践:搭建工程模板
开发语言·后端·golang
Lynko7 分钟前
C语言指针高阶
后端
the局外人8 分钟前
学习 FastAPI 的 Day 2:用异步 ORM 完成增删改查
后端·python·fastapi
维天说12 分钟前
Agent会听人话,反而更难管
java·开发语言·人工智能
SamDeepThinking13 分钟前
if嵌套最好控制在3层以内
java·后端·程序员
边境悍匪15 分钟前
蜗牛学苑 Java 智能体学习 Day36|阿里云 OSS 文件上传、Spring 事务、全局异常思维导图复盘
java·学习·阿里云
苏渡苇16 分钟前
Spring Insight 里上报 Span 为什么用 JDK HttpClient 而不是 RestTemplate
java·后端·spring·spring cloud·springboot·性能监控
tonydf16 分钟前
AI驱动历史项目安全审查
后端·ai编程
裕晟资质规划19 分钟前
军工保密资质二级申报的四个可量化硬条件:条文位置、数值口径与西安配套企业实务要点
java·服务器·网络·数据库·算法
初願致夕霞21 分钟前
C/C++传统程序内存分布(代码实测)
java·c语言·c++