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

自动装配协作者

Spring 容器可以自动连接协作 bean 之间的关系。您可以 让 Spring 自动解析 bean 的协作者(其他 bean) 检查ApplicationContext.Autowiring 具有以下功能 优势:spring-doc.cadn.net.cn

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

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

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

表 1.自动装配模式
模式 解释

nospring-doc.cadn.net.cn

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

byNamespring-doc.cadn.net.cn

按属性名称自动装配。Spring 查找与 需要自动装配的属性。例如,如果将 Bean 定义设置为 autowire 按名称进行,它包含一个master属性(即,它有一个setMaster(..)方法),Spring 会查找名为master和用途 it 来设置属性。spring-doc.cadn.net.cn

byTypespring-doc.cadn.net.cn

如果 中正好存在一个属性类型的 bean,则允许自动连接属性 容器。如果存在多个异常,则会引发致命异常,该异常指示 您不得使用byTypeautowire。如果没有匹配项 beans 时,什么都不会发生(属性未设置)。spring-doc.cadn.net.cn

constructorspring-doc.cadn.net.cn

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

byTypeconstructorautowiring 模式下,你可以将数组和 typed collections 的集合。在这种情况下,容器内所有 match 预期的类型来满足依赖项。您可以自动装配 强类型Mapinstances (如果预期的键类型为String.自动装配Mapinstance 的值由与预期类型匹配的所有 bean 实例组成,并且Mapinstance 的键包含相应的 bean 名称。spring-doc.cadn.net.cn

自动装配的局限性和缺点

当 Autowiring 在整个项目中一致地使用时,它的效果最佳。如果 autowiring 是 通常不使用,则开发人员可能会混淆仅使用它来连接一个 或 两个 bean 定义。spring-doc.cadn.net.cn

考虑自动装配的限制和缺点:spring-doc.cadn.net.cn

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

  • 自动装配不如显式装配精确。虽然,如前面的表格所示, Spring 会小心避免猜测,以防出现可能意想不到的歧义 结果。Spring 管理的对象之间的关系不再是 记录下来。spring-doc.cadn.net.cn

  • 连接信息可能不可用于可能从 一个 Spring 容器。spring-doc.cadn.net.cn

  • 容器中的多个 bean 定义可能与 setter 方法或构造函数参数进行自动装配。对于数组、集合或Map实例,这不一定是问题。但是,对于 expect 单个值,则此歧义不会任意解决。如果没有唯一的 bean 定义可用,则会引发异常。spring-doc.cadn.net.cn

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

从 Autowiring 中排除 Bean

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

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

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

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