如何避免 XML Spring bean 中的样板属性?

How to avoid boilerplate properties in XML Spring beans?

我的 applicationContext.xml 文件中有几个 Bean,它们共享相似的属性(它们实现相同的接口)。

我想避免每个 bean 的样板属性,而是让一个 bean 具有可以在每个 bean 中引用的这些属性。

目前我拥有的是:

<bean id="Animal"
    class="com.test.Dog">
    <constructor-arg ref="Coat"/>
    <constructor-arg value="Bark" index="1"
          type="java.lang.String"/>
    <constructor-arg value="Spot" index="2"
          type="java.lang.String"/>
</bean>


<bean id="Dog"
    class="com.test.Dog">
    <constructor-arg ref="Coat"/>
    <constructor-arg value="Bark" index="1"
          type="java.lang.String"/>
    <constructor-arg value="Spot" index="2"
          type="java.lang.String"/>
</bean>

    <bean id="Chicken"
        class="com.test.Chicken">
        <constructor-arg ref="Coat"/>
        <constructor-arg value="Cluck" index="1"
              type="java.lang.String"/>
        <constructor-arg value="Janice" index="2"
              type="java.lang.String"/>
    </bean>

    <bean id="Rhino"
        class="com.test.Rhino">
        <constructor-arg ref="Coat"/>
        <constructor-arg value="huff" index="1"
              type="java.lang.String"/>
        <constructor-arg value="Tank" index="2"
              type="java.lang.String"/>

    </bean>

    <bean id="Coat"
        class="com.test.Coat"></bean>

注意每个 bean 配置中的重复属性。

我想做的是这样的:

    <bean id="Animal"
        class="com.cat.test.Dog">
        <constructor-arg ref="properties"/>
    </bean>


    <bean id="Dog"
        class="com.cat.test.Dog">
        <constructor-arg ref="properties"/>
    </bean>

    <bean id="Chicken"
        class="com.cat.test.Chicken">
        <constructor-arg ref="properties"/>
    </bean>

    <bean id="Rhino"
        class="com.cat.test.Rhino">
        <constructor-arg ref="properties"/>
    </bean>

    <bean id="properties">
        <constructor-arg ref="Coat"/>
        <constructor-arg value="huff" index="1"
              type="java.lang.String"/>
        <constructor-arg value="Tank" index="2"
              type="java.lang.String"/>
    </bean> 

    <bean id="Coat"
        class="com.cat.test.Coat"></bean>

这样的事情可能吗?

你可以使用 bean 定义 inheritance

例如

<bean id="inheritedTestBean" abstract="true"
    class="org.springframework.beans.TestBean">
  <property name="name" value="parent"/>
  <property name="age" value="1"/>
</bean>

<bean id="inheritsWithDifferentClass"
      class="org.springframework.beans.DerivedTestBean"
      parent="inheritedTestBean" init-method="initialize">

  <property name="name" value="override"/>
  <!-- the age property value of 1 will be inherited from  parent -->

</bean>