|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
自动装配协作对象
Spring 容器可以自动连接协作的 bean。您可以通过检查 ApplicationContext 的内容,让 Spring 自动为您解析(其他 bean)。
自动装配具有以下优点:
-
自动装配可以显著减少指定属性或构造函数参数的需要。(其他机制,如本章其他地方讨论的bean模板 在这一点上也很有价值。)
-
自动装配可以随着对象的演变更新配置。例如,如果你需要向一个类添加依赖项,该依赖项可以自动满足,而无需你修改配置。因此,在开发过程中,自动装配尤其有用,而不会排除在代码库变得稳定后切换到显式装配的可能性。
在使用基于XML的配置元数据(参见 依赖注入)时,您可以使用 autowire 属性指定 bean 定义的自动装配模式。自动装配功能有四种模式。您可以在每个 bean 上指定自动装配,并因此选择要自动装配的那些。下表描述了四种自动装配模式:
| 模式 | 说明 |
|---|---|
|
(默认)不进行自动装配。Bean引用必须通过<code>0</code>元素定义。对于较大的部署,更改默认设置不建议,因为显式指定协作对象可以提供更大的控制和清晰度。在某种程度上,它能说明系统的结构。 |
|
按属性名称自动连线。Spring 会查找与需要自动连线的属性名称相同的 Bean。例如,如果一个 Bean 定义设置为按名称自动连线,并且它包含一个 |
|
如果容器中恰好存在一个与属性类型匹配的bean,则允许该属性进行自动注入。如果存在多个,则会抛出致命异常,这表明您可能不能对该bean使用 |
|
类似于 |
使用 byType 或 constructor 自动接线模式,可以接线数组和类型集合。在这种情况下,容器中所有符合预期类型的自动接线候选都会被提供以满足依赖关系。如果预期的键类型是 String,则可以自动接线强类型 Map 实例。自动接线的 Map 实例的值由所有符合预期类型的 bean 实例组成,而 Map 实例的键包含相应的 bean 名称。
自动装配的限制和缺点
自动注入在项目中一致使用时效果最佳。如果通常不使用自动注入,那么仅对一个或两个 bean 定义使用自动注入可能会让开发人员感到困惑。
考虑自动连线的局限性和缺点:
-
在
property和constructor-arg设置中的显式依赖项始终会覆盖自动连线。您无法自动连线简单属性,例如基本类型、Strings和Classes(以及这些简单属性的数组)。此限制是故意设计的。 -
自动装配不如显式连接精确。尽管如前所述的表格中所提到的,Spring在存在歧义的情况下会小心避免猜测,以免产生意外结果。你由Spring管理的对象之间的关系不再被显式地记录。
-
如果工具无法从Spring容器中生成文档,则可能无法获取布线信息。
-
容器中可能有多个Bean定义与要自动装配的setter方法或构造函数参数指定的类型匹配。对于数组、集合或
Map个实例来说,这不一定是个问题。然而,对于期望单个值的依赖项,这种歧义不会被随意解决。如果没有唯一的Bean定义可用,将抛出异常。
在后一种情况下,你有几个选项:
-
放弃自动装配,改用显式装配。
-
通过将bean定义的
autowire-candidate属性设置为false来避免自动连线,如< a t="C2">下一节所述。 -
通过将它的
<bean/>元素的primary属性设置为true,可以将单个bean定义指定为主要候选。 -
使用基于注解的配置提供的更细粒度的控制, 如 基于注解的容器配置 中所述。
排除自动装配的Bean
按每个Bean的设置,您可以将一个Bean排除在自动连线之外。在Spring的XML格式中,将autowire-candidate元素的<bean/>属性设置为false。容器会使得该特定的Bean定义无法被自动连线基础设施使用(包括诸如@Autowired之类的注解风格配置)。
The autowire-candidate attribute 仅用于影响基于类型的自动连线。
它不会影响按名称的显式引用,即使指定了的bean未被标记为自动连线候选,这些引用仍然会被解析。因此,如果名称匹配,按名称的自动连线仍然会注入一个bean。 |
您也可以根据基于对 bean 名称的模式匹配来限制自动连线候选。顶级 <beans/> 元素在其 default-autowire-candidates 属性中接受一个或多个模式。例如,要将自动连线候选状态限制为任何名称以 Repository 结尾的 bean,请提供值 *Repository。要提供多个模式,请在逗号分隔的列表中定义它们。bean 定义的 autowire-candidate 属性的显式值 true 或 false 总是具有优先权。对于这些 bean,模式匹配规则不适用。
这些技术适用于你永远不希望被自动注入到其他 bean 中的 bean。这并不意味着被排除的 bean 本身不能通过使用自动注入进行配置。而是说,该 bean 本身不是其他 bean 自动注入的候选对象。