此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

自动布线协作者

Spring 容器可以自动连接协作 Bean 之间的关系。您可以 让 Spring 通过以下方式自动解析您的 bean 的协作者(其他 bean)。 检查ApplicationContext.自动布线具有以下内容 优势:spring-doc.cadn.net.cn

  • 自动布线可以显着减少指定属性或构造函数的需要 参数。(其他机制,例如本章其他地方讨论的 bean 模板也很有价值 在这方面。spring-doc.cadn.net.cn

  • 自动布线可以随着对象的发展而更新配置。例如,如果您需要 要向类添加依赖项,可以自动满足该依赖项,而无需 您需要修改配置。因此,自动接线可能特别有用 在开发过程中,不会否定切换到显式布线的选项 代码库变得更加稳定。spring-doc.cadn.net.cn

使用基于 XML 的配置元数据(请参阅依赖项注入)时,您可以 可以使用autowire属性的<bean/>元素。自动布线功能有四种模式。指定自动布线 每个 bean,因此可以选择要自动连接哪些。下表描述了 四种自动接线模式:spring-doc.cadn.net.cn

表 1.自动接线模式
模式 解释

nospring-doc.cadn.net.cn

(默认)没有自动接线。Bean 引用必须由ref元素。改变 对于较大的部署,不建议使用默认设置,因为指定 协作者明确地提供了更大的控制权和清晰度。在某种程度上,它 记录系统的结构。spring-doc.cadn.net.cn

byNamespring-doc.cadn.net.cn

按属性名称自动布线。Spring 寻找与 需要自动连接的属性。例如,如果 Bean 定义设置为 autowire by name,它包含一个master属性(即,它有一个setMaster(..)方法),Spring 查找名为master和用途 it 来设置属性。spring-doc.cadn.net.cn

byTypespring-doc.cadn.net.cn

如果该属性类型的 bean 恰好存在于 容器。如果存在多个异常,则会抛出致命异常,这表示 您不得使用byType自动布线。如果没有匹配 beans,则什么也没发生(属性未设置)。spring-doc.cadn.net.cn

constructorspring-doc.cadn.net.cn

类似于byType但适用于构造函数参数。如果没有完全 容器中的一个构造函数参数类型的 bean,则会引发致命错误。spring-doc.cadn.net.cn

byTypeconstructorautowiring 模式下,您可以连接阵列和 类型化集合。在这种情况下,容器内的所有自动连接候选者 匹配预期类型以满足依赖关系。您可以自动布线 强类型Map如果预期的键类型为String.自动接线Map实例的值由与预期类型匹配的所有 Bean 实例组成,并且Map实例的键包含相应的 bean 名称。spring-doc.cadn.net.cn

自动接线的局限性和缺点

当自动布线在整个项目中一致使用时,效果最佳。如果自动接线是 通常不使用,仅使用它来连接一个或 两个 bean 定义。spring-doc.cadn.net.cn

考虑自动布线的局限性和缺点:spring-doc.cadn.net.cn

  • 显式依赖项propertyconstructor-arg设置始终覆盖autowirering。您不能自动连接简单的属性,例如基元、StringsClasses(以及此类简单属性的数组)。这个限制是设计使然。spring-doc.cadn.net.cn

  • 自动布线不如显式布线精确。虽然,如上表所述,Spring 小心翼翼地避免猜测,以防出现可能出现意外的歧义 结果。 Spring 管理的对象之间的关系不再明确记录。spring-doc.cadn.net.cn

  • 可能无法使用可能从一个 Spring 容器生成文档的工具。spring-doc.cadn.net.cn

  • 容器中的多个 bean 定义可以与setter 方法或构造函数参数指定的类型匹配,以自动连接。对于数组、集合或Map实例,这不一定是问题。但是,对于期望单个值的依赖项,这种歧义不会任意解决。如果没有唯一的 bean定义可用,则抛出异常。spring-doc.cadn.net.cn

在后一种情况下,您有多种选择:spring-doc.cadn.net.cn

从自动布线中排除 Bean

在每个 Bean 的基础上,您可以从自动布线中排除 Bean。在 Spring 的 XML 格式中,将 这autowire-candidate属性的<bean/>元素设置为false;使用@Bean注释,则该属性名为autowireCandidate.容器使 自动布线基础架构不可用的 Bean 定义,包括基于注释的 注入点,例如@Autowired.spring-doc.cadn.net.cn

autowire-candidate属性旨在仅影响基于类型的自动装配。它不会影响按名称的显式引用,即使指定的 bean 未标记为自动装配候选。因此,自动装配尽管如此,如果名称匹配,则按名称注入 bean。

您还可以根据与 Bean 名称的模式匹配来限制自动连接候选者。 这 顶层<beans/>元素接受其default-autowire-candidates属性。 例如,要将自动连接候选状态限制为名称以Repository,提供*Repository. 自 提供多个模式,在逗号分隔的列表中定义它们。显式值truefalse对于 bean 定义的autowire-candidate属性始终采用 优先。 对于此类 bean,模式匹配规则不适用。spring-doc.cadn.net.cn

这些技术对于您永远不想注入其他 bean 的 bean 很有用通过自动布线。这并不意味着排除的 bean 本身不能通过使用自动布线。相反,bean 本身不是自动布线其他 bean 的候选者。spring-doc.cadn.net.cn

从 6.2 开始,@Bean方法支持 Autowire 候选标志的两种变体:autowireCandidatedefaultCandidate.spring-doc.cadn.net.cn

使用限定符时,标记为defaultCandidate=false仅适用于注入点其中存在额外的限定符指示。这对于受限的应该在某些区域可注入但不打算妨碍其他地方相同类型的豆子。这样的豆子永远不会仅由普通声明的类型注入,而不是按类型加上特定限定符注入。spring-doc.cadn.net.cn

相比之下,autowireCandidate=false行为与autowire-candidate属性,如上所述:这样的 bean 根本不会被类型注入。spring-doc.cadn.net.cn