此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
自动布线协作者
Spring 容器可以自动连接协作 Bean 之间的关系。您可以
让 Spring 通过以下方式自动解析您的 bean 的协作者(其他 bean)。
检查ApplicationContext
.自动布线具有以下内容
优势:
-
自动布线可以显着减少指定属性或构造函数的需要 参数。(其他机制,例如本章其他地方讨论的 bean 模板也很有价值 在这方面。
-
自动布线可以随着对象的发展而更新配置。例如,如果您需要 要向类添加依赖项,可以自动满足该依赖项,而无需 您需要修改配置。因此,自动接线可能特别有用 在开发过程中,不会否定切换到显式布线的选项 代码库变得更加稳定。
使用基于 XML 的配置元数据(请参阅依赖项注入)时,您可以
可以使用autowire
属性的<bean/>
元素。自动布线功能有四种模式。指定自动布线
每个 bean,因此可以选择要自动连接哪些。下表描述了
四种自动接线模式:
模式 | 解释 |
---|---|
|
(默认)没有自动接线。Bean 引用必须由 |
|
按属性名称自动布线。Spring 寻找与
需要自动连接的属性。例如,如果 Bean 定义设置为
autowire by name,它包含一个 |
|
如果该属性类型的 bean 恰好存在于
容器。如果存在多个异常,则会抛出致命异常,这表示
您不得使用 |
|
类似于 |
跟byType
或constructor
autowiring 模式下,您可以连接阵列和
类型化集合。在这种情况下,容器内的所有自动连接候选者
匹配预期类型以满足依赖关系。您可以自动布线
强类型Map
如果预期的键类型为String
.自动接线Map
实例的值由与预期类型匹配的所有 Bean 实例组成,并且Map
实例的键包含相应的 bean 名称。
自动接线的局限性和缺点
当自动布线在整个项目中一致使用时,效果最佳。如果自动接线是 通常不使用,仅使用它来连接一个或 两个 bean 定义。
考虑自动布线的局限性和缺点:
-
显式依赖项
property
和constructor-arg
设置始终覆盖autowirering。您不能自动连接简单的属性,例如基元、Strings
和Classes
(以及此类简单属性的数组)。这个限制是设计使然。 -
自动布线不如显式布线精确。虽然,如上表所述,Spring 小心翼翼地避免猜测,以防出现可能出现意外的歧义 结果。 Spring 管理的对象之间的关系不再明确记录。
-
可能无法使用可能从一个 Spring 容器生成文档的工具。
-
容器中的多个 bean 定义可以与setter 方法或构造函数参数指定的类型匹配,以自动连接。对于数组、集合或
Map
实例,这不一定是问题。但是,对于期望单个值的依赖项,这种歧义不会任意解决。如果没有唯一的 bean定义可用,则抛出异常。
在后一种情况下,您有多种选择:
从自动布线中排除 Bean
在每个 Bean 的基础上,您可以从自动布线中排除 Bean。在 Spring 的 XML 格式中,将
这autowire-candidate
属性的<bean/>
元素设置为false
;使用@Bean
注释,则该属性名为autowireCandidate
.容器使
自动布线基础架构不可用的 Bean 定义,包括基于注释的
注入点,例如@Autowired
.
这autowire-candidate 属性旨在仅影响基于类型的自动装配。它不会影响按名称的显式引用,即使指定的 bean 未标记为自动装配候选。因此,自动装配尽管如此,如果名称匹配,则按名称注入 bean。 |
您还可以根据与 Bean 名称的模式匹配来限制自动连接候选者。 这 顶层<beans/>
元素接受其default-autowire-candidates
属性。 例如,要将自动连接候选状态限制为名称以Repository
,提供*Repository
. 自 提供多个模式,在逗号分隔的列表中定义它们。显式值true
或false
对于 bean 定义的autowire-candidate
属性始终采用 优先。 对于此类 bean,模式匹配规则不适用。
这些技术对于您永远不想注入其他 bean 的 bean 很有用通过自动布线。这并不意味着排除的 bean 本身不能通过使用自动布线。相反,bean 本身不是自动布线其他 bean 的候选者。
从 6.2 开始, 使用限定符时,标记为 相比之下, |