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。我的地盘我做主。

  • 相关阅读:
    React元素渲染
    初识JSX
    微信小程序复制文本到剪切板
    微信小程序报错request:fail url not in domain list
    小程序,通过自定义编译条件,模拟推荐人功能
    积分抵扣逻辑
    微信小程序 switch 样式
    tomcat 配置开启 APR 模式
    tomcat8 传输json 报错 Invalid character found in the request target. The valid characters are defined in RFC 3986
    c++数组初始化误区
  • 原文地址:https://www.cnblogs.com/ViviChan/p/4981539.html
Copyright © 2011-2022 走看看