更简单的取 Bean 对象(对象装配)(下)

简介: 更简单的取 Bean 对象(对象装配)(下)

三. @Resource 注解



上面的三种方法都是 Spring 官方提供的注入方式, 而在 JDK 中, 提供了另外的一种注入方式, @Resource 注解


同样的是将 ServiceStudent 类注入到 ControllerStudent 类中, 属性注入里不用 @Autowired 使用 @Resource 也是可以成功注入并调用的

image.png


那么, Setter 注入方法中, 使用 @Resource 注解可以吗 ?

f15f49d1eb24f2ef24ee79d6cb776014.png


通过验证可以发现, 同样是可以使用 @Resource 来搭配使用的, 那么为什么要造一个 @Resource 的轮子呢 ? 有什么用? 相比于 Spring 官方提供的三种注入方法又有什么优点呢 ?


@Resource 注解有什么用 ?


同样的, @Resource 注解通过上面的演示用例可以看到, 和其他注入方法一样, 都是将 Spring 容器中的类注入到其他类当中进行使用的


@Resource 和 @Autowired 有什么区别 ?


  • 相同点 : 功能上都可以进行类的注入
  • 不同点 :


1. @Autowired 注解比 @Resource 注解注入上更加强大**


@Autowired 可以支持构造方法注入和另外两种注入方式, 而 @Resource 却不支持构造方法注入, 只支持另外两种注入方式

ee986c3d136c6a9a2f3f7983a6f8f823.png


当把 @Resource 注解添加到构造方法注入中时, 显示该注释方法不能用于构造方法之上, 具有一定局限性


2. @Autowired 注解来自于 Spring 官方提供的, 而 @Resource 注解来自于 JDK


3. @Resource 支持的参数比 @Autowired 更多


3ccb0817cdd5c88d632d8182776c1b3c.png


可以看到的是, @Resource 提供的方法会参数更多, 在某些场景下会更加适用. 比如一个类多次注入到另一个类中, @Autowired 就无法实现, 而 @Resource 可以通过设置 name 属性的方式来解决这个问题.

@Autowired 注解只有一个参数可以设置, required(), 设置为 false 表示当前这个类在加载的时候不需要注入, 设置为 true 表示需要注入


f5f29fc33b31e269619e4b0a9edccfaf.png


4. @Autowired 和 @Resource 在 Spring 中查找的方式不同


比如同一个类已经注入多次的情况下, 通过属性注入的方式, 将该类注入到另一个类中, 例如下面,Student 这个类已经在 StudentCenter 类中被多次注入到 Spring 容器当中, 此时在将这个类通过属性注入到 StudentController2 这个类中.

57b1bdd4dcf70cfd58468be6fc329a33.png

0bd8439398bdc25922937fca41e21bda.png


获取 StudentController2 对象并调用

af980c8ce81e5de3993ebfebf159d38a.png


错误提示为找不到唯一的 Student 类型的 Bean 对象, 但是找到了两个可以匹配的 Bean 对象, 分别是 getStudentByName, getStudentByAge 这两个都是我们之前注入到 Spring 容器中的.


  • @Autowired 注解在获取 Bean 对象的时候, 先根据类型查找, 在根据名称查找


根据上面的问题, 结合 @Autowired 的查找方式来看 :


@Autowired 注解先根据类型去查找, 也就是 Student 类型去查找, 在加载依赖配置资源时, 发现了 Spring 容器中有两个 Student, 此时为了尽可能的去查找所需要的 Bean 对象, 会接着根据名称去查找, 也就是我们要注入的 student 这个名字去查找, 但是 Spring 容器中的 Student 类型的对象只有 getStudentByName, getStudentByAge 两个, 没有需要的名为 student 的, 因此报错找不到, 但是找到了两个 Student 类型的 Bean 对象


  • @Resource 注解在获取 Bean 对象的时候, 先根据名称查找, 在根据类型去查找


即使换成 @Resource 注解同样会报上面的错误, 找不到唯一的 Bean 对象, 这是因为 @Resource 注解先去根据名称查找, 但 Spring 容器中没有名称为 student 的 Bean 对象, 为了尽可能的去查找, 再去根据类型查找, 通过类型 Student 查找一看发现有两个该类型的 Bean 对象, 名称为 getStudentByName, getStudentByAge , 并非所需要的 Bean


那么上面的问题该怎么解决呢 ?


  1. 通过修改为指定名称

无论是 @Autowired 注解还是 @Resource 注解, 在通过查找时, 都只是查找到了指定类下有两个名称不一样的对象, 那么我们去指定获取这两个名称中的一个就可以获得了.

例如, 此处通过获取指定名称为 getStudentByName 的对象

34c167f63f904f5dfb7cad58149c23c5.png


很容易就拿到了这个对象, 那么, 如果我就是想用 student 这个名称怎么办呢 ? 有没有什么办法可以让我通过 student 这个名称也能获取到 ? 比如一个项目中, 这个变量已经使用了很多地方了, 去修改是很难的, 这时候就需要想办法去不替换如何实现了, 而 @Resource 就很好地解决了这个问题


  1. **使用 @Resource 注解并修改 name 属性 **


f55f2f9c3220a4bd6376d37995e9c7bd.png


可以看到, 通过设置 @Resource 注解的 name 属性以后, 查找方式就为先根据名称查找, 而此时的名称就不在是 student 这个变量名称了, 而是我们设置的新 name 属性的名称 getStudentByName 这个名称了, 而这个名称在 Spring 容器中有且只有一份, 因此 很容易就找到了.


最后 ,无论是使用那种方法进行对象注入, 在使用的时候前提都是在 Spring 容器中存在这个对象 !

相关文章
|
1月前
|
人工智能 Linux API
保姆级OpenClaw(Clawdbot)部署手册:阿里云一键部署、本地部署、百炼API配置与避坑指南
OpenClaw(曾用名Clawdbot/Moltbot)是一款面向任务自动化与工具调用的开源AI智能体框架,支持通过自然语言完成文件处理、代码编写、数据分析、系统管理、信息检索等自动化操作,可在云端与本地环境稳定运行。2026年版本进一步优化了部署流程、模型兼容与国内网络适配,尤其完善了对阿里云轻量服务器与阿里云百炼大模型的原生支持。本文基于2026年最新版本,提供**零基础可直接复制执行**的阿里云部署、本地部署、阿里云百炼API配置流程,附带完整代码命令、服务管理指令与高频问题解决方案,不涉及其他云平台信息,满足新手快速搭建与稳定使用需求。
1214 2
|
XML 机器人 C++
【4. ROS的主要通讯方式:Topic话题与Message消息】(2)
【4. ROS的主要通讯方式:Topic话题与Message消息】(2)
520 0
|
7天前
|
缓存 人工智能 自然语言处理
我对比了8个Claude API中转站,踩了不少坑,总结给你
本文是个人开发者耗时1周实测的8大Claude中转平台横向评测,聚焦Claude Code真实体验:以加权均价(¥/M token)、内部汇率、缓存支持、模型真实性及稳定性为核心指标。
3019 20
|
19天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
17054 53
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
14天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
3124 29
|
4天前
|
人工智能 测试技术 API
阿里Qwen3.6-27B正式开源:网友直呼“太牛了”!
阿里云千问3.6系列重磅开源Qwen3.6-27B稠密大模型!官网:https://t.aliyun.com/U/JbblVp 仅270亿参数,编程能力媲美千亿模型,在SWE-bench等权威基准中表现卓越。支持多模态理解、本地部署及OpenClaw等智能体集成,已开放Hugging Face与ModelScope下载。