《Spring Framework实战》14:4.1.4.5.自动装配合作者

news2025/1/13 17:17:25
欢迎观看《Spring Framework实战》视频教程

        1. 自动装配合作者

Spring容器可以自动连接协作bean之间的关系。您可以通过检查ApplicationContext的内容,让Spring自动为您的bean解析协作者(其他bean)。自动装配具有以下优点:

  1. 自动装配可以显著减少指定属性或构造函数参数的需要。(本章其他地方讨论的bean模板等其他机制在这方面也很有价值。)
  2. 自动装配可以随着对象的演变而更新配置。例如,如果需要向类添加依赖关系,则可以自动满足该依赖关系,而无需修改配置。因此,自动装配在开发过程中特别有用,而不会否定在代码库变得更加稳定时切换到显式装配的选项。

当使用基于XML的配置元数据时(请参阅依赖注入),您可以使用<bean/>元素的autowire属性为bean定义指定autowire模式。自动装配功能有四种模式。您可以为每个bean指定自动连线,从而可以选择要自动连线的bean。下表描述了四种自动接线模式:

表1自动化模式

模式

解释

no

(默认)没有自动连接。Bean引用必须由ref元素定义。不建议对较大的部署更改默认设置,因为明确指定协作者可以提供更大的控制和清晰度。在某种程度上,它记录了系统的结构。

byName

按属性名称自动装配。Spring寻找与需要自动连接的属性同名的bean。例如,如果一个bean定义被设置为按名称自动连接,并且它包含一个主属性(即它有一个setMaster(..)方法),Spring会查找一个名为master的bean定义并使用它来设置该属性。

byType

如果容器中只存在一个属性类型的bean,则允许对属性进行自动连接。如果存在多个异常,则会抛出致命的异常,这表示您可能无法对该bean使用byType自动连接。如果没有匹配的bean,则不会发生任何事情(属性未设置)。

constructor

类似于byType,但适用于构造函数参数。如果容器中没有一个构造函数参数类型的bean,则会引发致命错误。

使用byType或构造函数自动连接模式,您可以连接数组和类型化集合。在这种情况下,容器中与预期类型匹配的所有自动连线候选者都会被提供以满足依赖关系。如果预期的键类型为String,则可以自动连接强类型的Map实例。自动连接的Map实例的值由与预期类型匹配的所有bean实例组成,Map实例的键包含相应的bean名称。

          1. 自动化的局限性和缺点

自动装配在整个项目中一致使用时效果最佳。如果一般不使用自动连接,那么使用它来连接一两个bean定义可能会让开发人员感到困惑。

考虑自动装配的局限性和缺点:

  1. 属性和构造函数参数设置中的显式依赖关系始终覆盖自动连接。您无法自动连接简单属性,如基元、字符串和类(以及此类简单属性的数组)。这种限制是设计出来的。
  2. 自动装配不如显式装配精确。尽管如前表所示,Spring在出现可能产生意外结果的歧义时会小心避免猜测。Spring托管对象之间的关系不再明确记录。
  3. 从Spring容器生成文档的工具可能无法获得接线信息。
  4. 容器中的多个bean定义可能与要自动连接的setter方法或构造函数参数指定的类型匹配。对于数组、集合或Map实例,这不一定是问题。然而,对于期望单个值的依赖关系,这种模糊性并不是任意解决的。如果没有唯一的bean定义,则抛出异常。

在后一种情况下,您有几个选择:

  1. 放弃自动装配,转而采用显式装配。
  2. 如下一节所述,通过将bean定义的autowire候选属性设置为false来避免bean定义的自动装配。
  3. 通过将<bean/>元素的main属性设置为true,将单个bean定义指定为主要候选。
  4. 实现基于注释的配置提供的更细粒度的控制,如基于注释的容器配置中所述。
          1. 自动装配中排除Bean

在每个bean的基础上,您可以从自动连线中排除bean。在Spring的XML格式中,将<bean/>元素的autowire候选属性设置为false;使用@Bean注释,该属性被命名为autowireCandidate。容器使得特定的bean定义对自动装配基础设施不可用,包括基于注释的注入点,如@Autowired。

autowire候选属性旨在仅影响基于类型的自动装配。它不影响按名称的显式引用,即使指定的bean未标记为自动装配候选,这些引用也会被解析。因此,如果名称匹配,按名称自动装配仍会注入bean。

您还可以根据与bean名称的模式匹配来限制自动连线候选者。顶级<beans/>元素在其默认的autowired candidate属性中接受一个或多个模式。例如,要将autowire候选状态限制为名称以Repository结尾的任何bean,请提供*Repository的值。要提供多种模式,请在逗号分隔的列表中定义它们。bean定义的autowire候选属性的显式值true或false总是优先。对于此类bean,模式匹配规则不适用。

这些技术对于那些你永远不想通过自动连线注入其他bean的bean很有用。这并不意味着被排除的bean本身不能通过自动连线进行配置。相反,bean本身不是自动连线其他bean的候选者。

从6.2开始,@Bean方法支持autowire候选标志的两种变体:autowireCandidate和defaultCandidate。

使用限定符时,标记为defaultCandidate=false的bean仅适用于存在额外限定符指示的注入点。这对于那些应该在某些区域注射但不打算在其他地方妨碍同类型豆子的受限代表来说很有用。这样的bean永远不会只通过明文声明的类型注入,而是通过类型加上特定的限定符注入。

相比之下,autowireCandidate=false的行为与上述autowireCandidate属性完全相同:这样的bean根本不会按类型注入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitLab CI/CD使用runner实现自动化部署前端Vue2 后端.Net 7 Zr.Admin项目

1、查看gitlab版本 建议安装的runner版本和gitlab保持一致 2、查找runner 执行 yum list gitlab-runner --showduplicates | sort -r 找到符合gitlab版本的runner&#xff0c;我这里选择 14.9.1版本 如果执行出现找不到下载源&#xff0c;添加官方仓库 执行 curl -L &quo…

冒泡排序基础与实现

目录 1. 原理图 ​编辑 2. 什么是冒泡排序 3. 工作原理 3.1 具体步骤 3.2 时间复杂度 3.3 空间复杂度 4. 代码实现 5. 总结 1. 原理图 2. 什么是冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过重复地遍历要排序的列表&am…

acwing_5722_十滴水

acwing_5722_十滴水 下面这篇大佬的题解属实是把指针用明白了&#xff0c;可以好好理解一下&#xff1a; 原题解连接&#xff1a;AcWing 5722. 一个简单模拟实现 - AcWing map/unordered_map的用法:见收藏夹 #include<iostream> #include<unordered_map> #incl…

【AI进化论】 AI微信机器人 | sealos + 智能微秘书 打造AI机器人 | 智能微秘书配置教程

一、sealos 什么是sealos &#xff1f; One cloud OS for all applications 1、创建sealos账号密码 根据链接&#xff08;帮我凑点sealos使用额度感谢&#xff09;&#xff1a;https://cloud.sealos.run/?uidXfUpoQk92c 登录后如下页面&#xff1a; 2、创建应用 点击【应…

Agentless:OpenAI 采用的非代理框架

不需要代理库来解决复杂的业务问题。Agentless 是OpenAI采用的非代理框架&#xff0c;用于在 o3 的 SWE Bench 上实现最高精度。SWE-bench 是 github的真实软件工程问题基准。Agentless 遵循简单的三阶段流程&#xff1a;本地化、修复和补丁验证&#xff1a; 1 ⃣生成存储库的…

Model-based RL自动出价算法的演进之路

▐ 导读 近年来&#xff0c;强化学习自动出价算法已成为智能投放领域的标志性技术&#xff0c;然而其所存在的在离线不一致、线上数据覆盖空间受限等关键问题尚未被完全解决。在本文中&#xff0c;我们提出一种Model-based RL&#xff08;MBRL&#xff09;自动出价算法训练新范…

【Cocos TypeScript 零基础 7.1】

目录 重写 小结一下心得页面跳转背景移动精简 player敌机精灵 重写 小结一下心得 本人重写了整个项目 有了点小心得 页面跳转 director.loadScene(s2)背景移动 canvas 是画布 为什么要向上图布局? 方便计算相对坐标,脚本还是只写一个 绑定上 BG 一样跑,不影响 export cl…

鸿蒙UI(ArkUI-方舟UI框架)

参考&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/arkts-layout-development-overview-V13 ArkUI简介 ArkUI&#xff08;方舟UI框架&#xff09;为应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff…

禅道使用实践(2)-产品篇

前言 本文目的皆在指导产品团队使用禅道基于实操完成产品&#xff0c;项目的创建&#xff0c;需求汇总&#xff0c;版本规划&#xff0c;以及验收发布的基本流程。希望能帮助到首次使用禅道而不知道从何下手的团队。 基本概念 此章节内容与我上一篇的开发篇相同&#xff0c;从…

js逆向说明

一 负载的内容传输用这个格式 Content-Type: multipart/form-data Content-Type 是 HTTP 请求头中的一个字段&#xff0c;它告诉服务器请求体的类型。在这个例子中&#xff0c;Content-Type 的值为 multipart/form-data&#xff0c;这表示请求体采用了 multipart/form-data 格…

django基于Python的汽车销售管理系统的设计与实现

Django 基于 Python 的汽车销售管理系统的设计与实现 一、系统概述 Django 基于 Python 的汽车销售管理系统是一款专为汽车销售企业打造的综合性信息化管理平台。该系统借助 Django 框架的高效性、安全性以及 Python 语言丰富的库和工具&#xff0c;全面覆盖汽车销售业务的各…

计算机网络相关习题整理

第一讲 传输媒介 【知识点回顾】 两种导线可以减小电磁干扰&#xff1a; 双绞线&#xff08;分为非屏蔽双绞线、屏蔽双绞线&#xff09;&#xff08;RJ-45用&#xff09;同轴电缆&#xff08;短距离使用&#xff09;网络通信的基本单位&#xff1a;位&#xff08;bit&#xff…

HTTPS SSL/TLS 工作流程

目录 一、HTTP/HTTPS 简介1、HTTP协议相关内容2、HTTPS协议3、HTTP版本差异&#xff1a; 二、HTTPS 协议工作流程解析1. 客户端请求 SSL 握手2. 服务端接收 SSL 握手连接3. TLS 握手中的密钥协商4. HTTP 数据的加密与解密5. 安全性保障 三、HTTPS 协议的相关知识拓展1. TLS 与 …

SpringBoot项目实战(39)--Beetl网页HTML文件中静态图片及CSS、JS文件的引用和展示

使用Beetl开发网页时&#xff0c;在网页中使用的CSS、JS、图片等静态资源需要进行适当的配置才可以展示。大致的过程如下&#xff1a; &#xff08;1&#xff09;首先Spring Security框架需要允许js、css、图片资源免授权访问。 &#xff08;2&#xff09;网站开发时&#xff0…

node_exporter 安装

cd /root/node_exporter wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz #运行 cd /root/node_exporter/node_exporter-1.7.0.linux-amd64 ./node_exp…

【STM32-学习笔记-4-】PWM、输入捕获(PWMI)

文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…

【复习小结】1-13

数学追求更简洁的表达&#xff0c;计算机追求更简单的表达。数据结构把数学的逻辑结构放进计算器的存储器。 DAY4 闰年的计算 布尔类型是一种数据类型&#xff0c;用于表示逻辑值的简单类型&#xff0c;它的值只能是真&#xff08;true&#xff09;或假&#xff08;false&…

VSCode连接Github的重重困难及解决方案!

一、背景&#xff1a; 我首先在github创建了一个新的项目&#xff0c;并自动创建了readme文件其次在vscode创建项目并写了两个文件在我想将vscode的项目上传到对应的github上时&#xff0c;错误出现了 二、报错及解决方案&#xff1a; 1.解决方案&#xff1a; 需要在git上配置用…

vue-cli项目配置使用unocss

在了解使用了Unocss后&#xff0c;就完全被它迷住了。接手过的所有项目都配置使用了它&#xff0c;包括一些旧项目&#xff0c;也跟同事分享了使用Unocss的便捷性。 这里分享一下旧项目如何配置和使用Unocss的&#xff0c;项目是vue2vue-cli构建的&#xff0c;node<20平常开…

StarRocks Awards 2024 年度贡献人物

在过去一年&#xff0c;StarRocks 在 Lakehouse 与 AI 等关键领域取得了显著进步&#xff0c;其卓越的产品功能极大地简化和提升了数据分析的效率&#xff0c;使得"One Data&#xff0c;All Analytics" 的愿景变得更加触手可及。 虽然实现这一目标的道路充满挑战且漫…