java - Spring - 将多个属性集包含到一个 bean 中

标签 java spring mixins

假设我有以下 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>

其中 blockblock-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/

相关文章:

java - 在 javadoc 中记录逻辑

java - 伪代码非极大值抑制

java - hibernate导入import.sql失败

java - CORS 过滤器出现问题

python - 在 Python 中可以不使用继承来实现混合行为吗?

python - 混合 Detail View 和 Form Mixin django 的问题

java - 当 Activity 名称存储在列表中时访问 Activity

java - 尝试持久化实体时出现 DataException

Java Spring 项目结构 - 未检测到 Controller

ruby - RSpec - 模拟(或 stub )覆盖的 mixin 方法