假设我有以下 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 :
<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 本身中尚未存在的任何内容(即,与构建某些工厂/属性 setter /在 Spring 上下文文件等中使用的其他内容相关的任何内容)
目的是重用定义(即 block )而不建立任何关系(例如父子关系或类似的东西)。作为示例,这是标准 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
将是共享的),也可能是它们使用相同的凭据(因此用户名
和密码
将是共享的)。我想做这样的事情:
<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>
或者类似的东西。显然,对于这个简单的例子来说,这可以是父子关系,我只是想知道混合类型的解决方案。 Spring 为多个文件提供的功能几乎相同,除了 bean 级别之外。
欢迎就为什么执行上述操作不好或其他方法提出意见。
最佳答案
子节点上带有merge = true
的父子节点是spring支持的。 merge
确实充当混合(以集合的方式),对吗?
关于java - Spring - 将多个属性集包含到一个 bean 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9187462/