zoukankan      html  css  js  c++  java
  • 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的候选者。

  • 相关阅读:
    YUI的treeview组件——带checkbox类型的treeview如何实现disabled功能
    [转载 js] 15个基于Web的HTML编辑器
    YUI3学习笔记 ( 8 )
    js中用于继承的函数extend——摘自《javascript设计模式》
    YUI的treeview组件——带checkbox类型的treeview如何实现disabled功能
    YUI3学习笔记 ( 8 )
    Delphi 2007 代码补全、语句提示的快捷键是什么?
    Fastreport使用经验(转)在Delphi程序中访问报表对象
    cxGrid使用记录
    Delphi编程地一些小程序
  • 原文地址:https://www.cnblogs.com/springmorning/p/10339493.html
Copyright © 2011-2022 走看看