zoukankan      html  css  js  c++  java
  • Spring

    当我们要往一个bean的某个属性里注入另外一个bean,我们会使用<property> + <ref/>标签的形式。但是对于大型项目,假设有一个bean A被多个bean引用注入,如果Aid因为某种原因修改了,那么所有引用了Abean<ref/>标签内容都得修改,这时候如果使用autowire="byType",那么引用了Abean就完全不用修改了。autowire到底都什么用?我们继续往下看。

     

    autowire的用法:

    <bean id="auto" class="example.autoBean" autowire="byType"/>

     

    autowire属性有5种模式,如下表:

    模式

    说明

    no

    (默认)不采用autowire机制.。这种情况,当我们需要使用依赖注入,只能用<ref/>标签。

    byName

    通过属性的名称自动装配(注入)。Spring会在容器中查找名称与bean属性名称一致的bean,并自动注入到bean属性中。当然bean的属性需要有setter方法。例如:bean A有个属性mastermastersetter方法就是setMasterA设置了autowire="byName",那么Spring就会在容器中查找名为masterbean通过setMaster方法注入到A中。

    byType

    通过类型自动装配(注入)。Spring会在容器中查找类(Class)与bean属性类一致的bean,并自动注入到bean属性中,如果容器中包含多个这个类型的beanSpring将抛出异常。如果没有找到这个类型的bean,那么注入动作将不会执行。

    constructor

    类似于byType,但是是通过构造函数的参数类型来匹配。假设bean A有构造函数A(B b,   C c),那么Spring会在容器中查找类型为BCbean通过构造函数A(B b, C c)注入到A中。与byType一样,如果存在多个bean类型为B或者C,则会抛出异常。但时与byType不同的是,如果在容器中找不到匹配的类的bean,将抛出异常,因为Spring无法调用构造函数实例化这个bean

    default

    采用父级标签(即beans的default-autowire属性)的配置。

     

    其中byTypeconstructor模式也支持数组和强类型集合(即指定了集合元素类型)。如bean A有个属性定义是List<Foo>类型,Spring会在容器中查找所有类型为Foobean,注入到该属性。记住是Foo,不是List

    另外如果集合和Map集合,那么Mapkey必须是String类型,Spring会根据value的类型去匹配。例如有属性bean A中有一个属性为Map<String, Foo> p,容器中有bean BC类型均为Foo,那么A实例化完成后,p属性的值为:{"B"B的实例对象,"C"C的实例对象}

     

    除了可以给单独一个bean配置autowire属性,我们还可以给某个bean配置文件的<beans/>标签添加default-autowire属性。在<beans/>标签中指定default-autowire属性,那么对于子标签<bean/>如果没有单独的设置autowire属性,那么将采用父标签<beans/>default-autowire属性的模式,如果单独设置了autowire属性,则采用自己的模式。

     

    虽然autowrie给我们带来配置的便利性,但是也有缺点,比如会导致bean的关系没那么显而易见,所以用autowire还是ref还是需要根据项目来决定。

     

    autowire-candidate

    前面我们说到配置有autowire属性的beanSpring在实例化这个bean的时候会在容器中查找匹配的beanautowire bean进行属性注入,这些被查找的bean我们称为候选bean。作为候选bean,我凭什么就要被你用,老子不给你用。所以候选bean给自己增加了autowire-candidate="false"属性(默认是true),那么容器就不会把这个bean当做候选bean了,即这个bean不会被当做自动装配对象。同样,<beans/>标签可以定义default-autowire-candidate="false"属性让它包含的所有bean都不做为候选bean。我的地盘我做主。

  • 相关阅读:
    ADO 缓存更新
    DBNavigator中把insert变为append
    JQuery 选择器
    VS2013默认打开HTML文件没有设计视图
    windows 关机 重启 命令
    java如何计算两个日期之间相差多少天?
    java的list集合操作List<T>转化List<Long>
    ExcelUtil工具类
    oracle的START WITH CONNECT BY PRIOR用法
    oracle的with as用法
  • 原文地址:https://www.cnblogs.com/ViviChan/p/4981539.html
Copyright © 2011-2022 走看看