zoukankan      html  css  js  c++  java
  • spring 配置中相关属性的含义:

    1:parent元素属性

    一个bean定义可能会包含大量的配置信息,包括容器相关的信息(比如初始化方法,静态工厂方法等等)以及构造函数参数和属性的值。一个child bean定义是一个能够从parent bean定义继承配置数据的bean定义。然后它可以覆盖一些值,或者添加一些其他需要的。使用父和子的bean定义可以节省很多的输入工作。实际上,这就是一种模版形式。当编程式地使用一个BeanFactory,child bean定义用ChildBeanDefinitiaon类表示。大多数的用户从来不需要在这个级别上使用它们,取而代之的是,在诸如XmlBeanFactory中声明式地配置bean定义。在一个XmlBeanFactory的bean定义中,使用parent属性指出一个child bean定义,而parent bean则作为这个属性的值。

    <bean id="inheritedTestBean" class="org.springframework.beans.TestBean">
        <property name="name"><value>parent</value></property>
        <property name="age"><value>1</value></property>
    </bean>
    <bean id="inheritsWithDifferentClass"
    class="org.springframework.beans.DerivedTestBean"
           parent="inheritedTestBean" init-method="initialize">
        <property name="name"><value>override</value></property>
        <!-- age should inherit value of 1 from parent -->
    </bean>
    

     如果child bean定义没有指定class,一个child bean定义将使用父定义的class,当然也可以覆盖它。在后面一种情况中,child bean的class必须同parent bean的兼容,比如它必须能够接受父亲的属性值。
    一个child bean定义将会从父亲处继承构造函数参数,属性值以及方法,并且可以选择地增加新的值。如果初始化方法,销毁方法和/或静态工厂方法被指定了,它们就会覆盖父亲相应的设置。
    剩余的设置将总是从子定义处得到:depends on, autowire mode, dependency check, singleton, lazy init。
    在下面的例子中父定义并没有指定一个class: 

    <bean id="inheritedTestBeanWithoutClass">
        <property name="name"><value>parent</value></property>
        <property name="age"><value>1</value></property>
    </bean>
    <bean id="inheritsWithClass" class="org.springframework.beans.DerivedTestBean"
          parent="inheritedTestBeanWithoutClass" init-method="initialize">
        <property name="name"><value>override</value></property>
        <!-- age should inherit value of 1 from parent -->
    </bean>
    

      这个parent bean就无法自己实例化;它实际上仅仅是一个纯模版或抽象bean,仅仅充当子定义的父定义。若要尝试单独使用这样的parent bean(比如将它作为其他bean的ref属性而引用,或者直接使用这个parent bean的id调用getBean()方法),将会导致一个错误。同样地,容器内部的preInstantiateSingletons方法会完全忽略这种既没有parent也没有class属性的bean定义,因为它们是不完整的。
    重要的注意点:这里并没有办法显式地声明一个bean定义为抽象的。如果一个bean确实有一个class定义,那么它就能够被实例化。而且要注意XmlBeanFactory默认地将会预实例化所有的singletons。因此很重要的一点是:如果你有一个(父)bean定义指定了class属性,而你又想仅仅把它当作模板使用,那么你必须保证将lazy-init属性设置为true(或者将bean标记为non-singleton),否则XmlBeanFactory(和其他可能的容器)将会预实例化它。

  • 相关阅读:
    javascript学习_函数调用模式与this取值
    Git 学习笔记(Git教程-廖雪峰)
    Linux学习一周初体验
    前言_写在立冬时
    2021.10.24驾考日记
    大二上学期的HTML杂碎
    AISing Programming Contest 2021(AtCoder Beginner Contest 202)D题题解
    并查集两优化——按秩合并与路径压缩
    [算法板子] 求拓扑序列(拓扑排序)
    浅谈迭代加深搜索 ( IDDFS )
  • 原文地址:https://www.cnblogs.com/hoojjack/p/4647692.html
Copyright © 2011-2022 走看看