【发布时间】:2012-02-29 13:01:04
【问题描述】:
假设我有以下 bean:
<bean id="some-bean" class="com.icyrock.example.SomeBean">
<property name="pa1" value="va1"/>
<property name="pa2" value="va2"/>
<property name="pa3" value="va3"/>
<property name="pa4" value="va4"/>
<property name="pa5" value="va5"/>
<property name="pa5">
<bean class="com.icyrock.example.SomeOtherBean>
<property name="px1" value="vx1"/>
<property name="px2" value="vx2"/>
<property name="px3" value="vx3"/>
<property name="px4" value="vx4"/>
<property name="px5" value="vx5"/>
</bean>
</property>
</bean>
我想把它分成几块:
<block id="b1">
<property name="pa1" value="va1"/>
<property name="pa2" value="va2"/>
<property name="pa3" value="va3"/>
</block>
<block id="b2">
<property name="pa4" value="va4"/>
<property name="pa5" value="va5"/>
</block>
<block id="b3">
<property name="px1" value="vx1"/>
<property name="px2" value="vx2"/>
</block>
<block id="b4">
<property name="px3" value="vx3"/>
<property name="px4" value="vx4"/>
<property name="px5" value="vx5"/>
</block>
<bean id="some-bean" class="com.icyrock.example.SomeBean">
<block-ref id="b1"/>
<block-ref id="b2"/>
<property name="pa5">
<bean class="com.icyrock.example.SomeOtherBean>
<block-ref id="b3"/>
<block-ref id="b4"/>
</bean>
</property>
</bean>
其中block 和block-ref 是虚构的Spring 标签,只是为了说明这个想法。
有没有办法做到这一点:
- 更改 Java 类(例如,接受属性映射或子类)
- 使用 Spring 本身尚不存在的任何东西(即任何类似于构建一些工厂/属性设置器/在 Spring 上下文文件中使用的任何其他东西)
目的是重用定义(即块)而不建立任何关系(例如父子关系或类似的东西)。例如,这是标准的 JDBC 数据源定义:
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
(来自here 的示例)。如果有不同的服务器被访问,可能是它们共享相同的驱动程序(所以driverClassName 将是共享的),也可能是它们使用相同的凭据(所以username 和@987654329 @ 将是共享的)。我想做类似的事情:
<block id="driver-credentials">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</block>
<bean id="ds1" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.url1}"/>
<block-ref id="driver-credentials"/>
</bean>
<bean id="ds2" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.url2}"/>
<block-ref id="driver-credentials"/>
</bean>
<bean id="ds3" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.url3}"/>
<block-ref id="driver-credentials"/>
</bean>
或类似的东西。显然,对于这个简单的示例,这可能是一个父子,我只是想知道一个 mixin 类型的解决方案。 Spring 为多个文件提供的功能几乎相同,除了 bean 级别。
欢迎对为什么执行上述操作不好或替代方法提出意见。
【问题讨论】: