如何避免 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>
我的 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>