新闻详情

新闻详情

首页 / 资讯中心 / 详情

@Resource详解

发布时间:2026/10/2 3:03:39来源:尧图网络
@Resource详解
Resource是 JSR-250 规范提供的依赖注入注解由 JDK 定义Spring 对其提供了完整支持。它和Autowired功能相似但装配规则和适用场景有明显区别。一、来源与定义Resource的全限定名是javax.annotation.ResourceJava 8 及以前或jakarta.annotation.ResourceJakarta EE 9Spring Boot 3 使用。它不属于 Spring 专有而是 Java 标准库的一部分。在 Spring Boot 3 项目中需要确保引入了jakarta.annotation-api依赖通常由spring-boot-starter自动传递。importjakarta.annotation.Resource;ServicepublicclassUserService{ResourceprivateUserDaouserDao;}二、装配规则Resource的装配顺序与Autowired相反默认按名称byName匹配。如果不指定name属性使用字段名或 setter 方法对应的属性名作为 Bean 名称。按名称找不到时回退到按类型byType匹配。如果指定了name只按名称查找不按类型。如果指定了type只按类型查找。ServicepublicclassUserService{// 字段名 userDao先按名称 userDao 查找ResourceprivateUserDaouserDao;}如果容器中只有一个UserDao类型的 Bean但它的名称不是userDaoResource会先尝试按userDao查找找不到再按类型注入。三、name 和 type 属性1. name 属性显式指定 Bean 名称只按名称匹配。Resource(nameuserDaoImpl)privateUserDaouserDao;此时容器中必须存在名称恰好为userDaoImpl的 Bean否则抛出NoSuchBeanDefinitionException。2. type 属性显式指定类型只按类型匹配。Resource(typeUserDao.class)privateUserDaouserDao;如果同类型有多个 Bean会抛出NoUniqueBeanDefinitionException。3. name 和 type 同时指定同时指定时要求容器中存在名称和类型都匹配的 Bean否则报错。四、使用位置Resource支持的位置字段Setter 方法ServicepublicclassUserService{privateUserDaouserDao;ResourcepublicvoidsetUserDao(UserDaouserDao){this.userDaouserDao;}}Resource不支持构造器注入方法参数注入Bean方法参数required false语义五、与 Autowired 的对比对比维度ResourceAutowired来源JSR-250JDKSpring 专有默认匹配先按名称再按类型先按类型再按名称指定名称name属性Qualifier指定类型type属性无需指定默认按类型required 属性不支持支持required false构造器注入不支持支持方法参数注入不支持支持Primary 支持不支持支持处理类CommonAnnotationBeanPostProcessorAutowiredAnnotationBeanPostProcessorResource更适合“按名称注入”的场景代码更简洁。Autowired功能更丰富支持构造器注入和可选依赖。六、底层处理机制Resource由CommonAnnotationBeanPostProcessor处理。它是 Spring 容器中的一个BeanPostProcessor同时负责PostConstruct、PreDestroy等 JSR-250 注解。处理时机在 Bean 生命周期的属性填充阶段populateBean()通过postProcessProperties()方法完成注入。简化流程// CommonAnnotationBeanPostProcessorpublicPropertyValuespostProcessProperties(PropertyValuespvs,Objectbean,StringbeanName){// 1. 查找 Resource 注解的元数据InjectionMetadatametadatafindResourceMetadata(beanName,bean.getClass(),pvs);// 2. 执行注入metadata.inject(bean,beanName,pvs);returnpvs;}注入时ResourceElement.getResourceToInject()会根据name和type调用beanFactory.resolveDependency()或beanFactory.getBean(name)获取目标 Bean。七、常见问题1. 找不到 BeanNoSuchBeanDefinitionException: No bean named userDao available原因字段名与 Bean 名称不一致且容器中没有该名称的 Bean。解决指定name属性或将字段名改为与 Bean 名称一致。2. 同类型多个 Bean 冲突NoUniqueBeanDefinitionException: expected single matching bean but found 2原因按名称找不到回退到按类型但同类型有多个 Bean。解决显式指定name属性。3. Spring Boot 3 中找不到 jakarta.annotation.Resource需要确认依赖dependencygroupIdjakarta.annotation/groupIdartifactIdjakarta.annotation-api/artifactId/dependencySpring Boot 3 的spring-boot-starter已经包含该依赖。4. Resource 不支持构造器注入构造器注入只能用Autowired或省略注解单构造方法时。5. 静态字段无法注入Resource不能直接注入静态字段。需要通过实例方法赋值给静态变量。八、最佳实践需要按名称注入时优先使用Resource代码比Autowired Qualifier更简洁。需要构造器注入时使用Autowired或RequiredArgsConstructor。需要可选依赖时使用Autowired(required false)。在非 Spring 环境如标准 Java EE中Resource可保持代码的可移植性。团队统一风格避免同一个项目中混用两种注解导致理解成本增加。九、总结Resource是 JSR-250 标准的依赖注入注解默认按名称匹配找不到再按类型。它支持字段和 Setter 注入不支持构造器注入和required false。底层由CommonAnnotationBeanPostProcessor处理。维度核心要点来源JSR-250jakarta.annotation.Resource默认匹配先按名称再按类型属性name名称、type类型支持位置字段、Setter不支持构造器、方法参数、required false处理类CommonAnnotationBeanPostProcessor适用场景按名称注入、非 Spring 环境选择Resource还是Autowired取决于具体场景。按名称注入用Resource更直接构造器注入和可选依赖用Autowired更灵活。理解两者的装配顺序和底层处理能帮你在实际开发中做出合适的选择。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

网络基础实战详解:从TCP/IP分层到IP子网与排障工具 2026/10/2 3:03:32

网络基础实战详解:从TCP/IP分层到IP子网与排障工具

1. 网络基础到底在学什么一说"网络基础",很多人第一反应就是背IP地址、记协议端口号,或者把OSI七层模型从头背到尾。但实际工作里真正有用的,是理解数据从一台设备到另一台设备之间到底经历了什么,每层干了什么活&#…

阅读更多 →
网络基础实战指南:从TCP/IP分层到DNS与抓包排障 2026/10/2 3:03:32

网络基础实战指南:从TCP/IP分层到DNS与抓包排障

一个做运维的老朋友前两天找我,说家里网络突然卡成幻灯片,他折腾了半天,路由器重启了、网线也换了,甚至连光猫都恢复出厂了,问题还在。我让他打开命令行敲了两条命令,三分钟定位到是某台设备占了IP&#xf…

阅读更多 →
claude-code-main.zip 安装实战:从解压到命令行 AI 助手 2026/10/2 3:03:26

claude-code-main.zip 安装实战:从解压到命令行 AI 助手

简介:claude-code-main.zip 是 claude-code 项目的源码压缩包,适合希望研读 TypeScript 全栈或前端项目实现细节的开发者使用。包内共 1903 个文件,以 1332 个 ts 与 552 个 tsx 文件为主体,辅以少量 js 与 1 个 md 说明文档&…

阅读更多 →
基于springboot + vue景德镇瓷器销售系统(源码+数据库+文档) 2026/10/2 3:03:26

基于springboot + vue景德镇瓷器销售系统(源码+数据库+文档)

景德镇瓷器销售系统 目录 基于springboot vue景德镇瓷器销售系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取: 基于springboot vue景德镇瓷器销售系统 一、前言 博主…

阅读更多 →
OpenClaw实战:从WSL2环境配置到跑通第一句Hello 2026/10/2 3:03:26

OpenClaw实战:从WSL2环境配置到跑通第一句Hello

如果你关注AI智能体(Agent)方向,最近大概率刷到过OpenClaw这个名字。它是一个开源的、本地优先的个人AI助手运行时,和市面上那些套壳ChatBot完全不同,它更像是给大模型装上了一套能收消息、能执行任务、能记住上下文的…

阅读更多 →
Flink双流联结详解:窗口联结与间隔联结实战指南 2026/10/2 3:03:20

Flink双流联结详解:窗口联结与间隔联结实战指南

做了这么多年Flink,如果让我选一个最绕人、也最值得彻底搞懂的知识点,双流联结绝对排前三。前十二篇我们把时间语义、窗口、Watermark、状态后端挨个啃了一遍,这一篇正好把它们全串起来——基于时间的合流,也就是所谓的双流联结&a…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉