Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.4.5 自动装配

6.4.5 自动装配

Spring容器可以在协作bean之间自动建立关系。你可以允许Spring通过检查ApplicationContext的上下文,自动为你的bean解析协作者(其他bean)。自动装配具有以下优点:

  • 自动装配可以显著减轻指定属性或构造参数的需求量;
  • 自动装配可以随着你对象的演化而更新配置。例如:如果你需要为一个类添加新的依赖,这个依赖可以自动满足而不需要你去修改配置文件。因此,自动装配在开发期间特别有用。

当使用基于XML配置,你可以通过<bean/>元素的autowire属性指定自动装配的模式,其中

自动装配有以下4种模式。您指定自动装配的每个bean并且也可以选择自动装配哪些个。

表6.2 自动装配模式

模式

解释

(默认)不会自动装配。Bean的引用必须通过定义ref元素来实现。

byName

通过属性名进行自动装配。Spring会通过查找跟属性名称一致的Bean去装配。

byType

允许通过跟属性类型一致的Bean进行装配,但是如果类型一致的Bean在容器中存在多个,则会报错,属性就装配不成功。

constructor

跟byType类似,但是这种是针对构造参数进行装配。如果容器中不存在跟构造参数类型一致的Bean,则会报错。

使用byType和constructor自动装配模式,你可以连接数组和类型集合。在这种情况下,提供容器内与预期类型匹配的所有autowire候选者都可以被用于装配Bean。 如果预期的键类型为String,则可以自动装配强类型的Maps。 自动装配的强类型Maps值由预期类型匹配的所有Bean实例组成,而Maps键则与bean名称相对应。

您可以将autowire行为与依赖性检查相结合,这将在自动装配完成后执行。

自动装配的局限性和缺点

当在整个项目中一致地使用自动装配时,自动装配效果最佳。一般情况下,如果不使用自动装配,那么开发人员就会对用它来装配一个或两个bean定义感到困惑。

自动装配的局限性和缺点:

  • 在属性和构造参数上的显式设置总会覆盖自动装配。你不能自动装配像基础类型、字符串和类类型(以及这样简单属性的数组),这是设计上的局限性。
  • 自动装配没有明确配置那么准确。虽然如上表所示,Spring会注意避免猜测,以防在不明确导致意外结果。Spring管理对象之间的关系也不会被明确记录。
  • 依赖信息可能对于从Spring容器生成文档的工具来说不可用。
  •  容器中多个Bean可能与set方法或者构造参数的类型匹配。对于数组、集合或Maps,这样不成问题。然而对于单一依赖,这种模糊性就不允许了,如果没有唯一Bean可用,就会抛出异常。

在后一种情况下,你有几种选择:

  • 显式设置依赖,不采用自动装配
  • <bean/>元素上设置autowire-candidate属性值为false,就可以避免自动装配,像下一章节描述的一样。
  •  通过将其<bean />元素的primary属性设置为true,将单个bean定义指定为主要候选者。
  • 基于注解配置可以实现更细粒度的控制,像6.9节“基于注解的容器配置”描述的一样
从自动装配中排除一个bean

在每个bean的基础上,您可以从自动装配中排除bean。 在Spring的XML格式中,将<bean />元素的autowire-candidate属性设置为false; 容器使指定的bean的定义对自动装配体系结构不可用(包括注解样式的配置,如@Autowired)。

您还可以基于bean名称的模式匹配来限制autowire候选者。顶级元素<beans />在其default-autowire-candidates属性中接受一个或多个匹配模式。例如,要将autowire候选状态限制为名称以Repository结尾的任何bean,可以提供值为* Repository。要提供多个模式,请在逗号分隔的列表中定义它们。bean定义autowire-candidate属性的显式值true或false始终具有更高的优先级,对于此类bean,模式匹配规则不适用。

对于您永远不希望通过自动装配注入其他的bean,这些技术是非常有用。这并不意味着被排除的bean本身不能使用自动装配进行配置,而是非自动装配其他bean的候选者。

猜你喜欢

转载自www.cnblogs.com/springmorning/p/10339493.html