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