【问题标题】:Spring - including multiple property sets into a beanSpring - 将多个属性集包含在一个 bean 中
【发布时间】: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>

其中blockblock-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 级别。

欢迎对为什么执行上述操作不好或替代方法提出意见。

【问题讨论】:

    标签: java spring mixins


    【解决方案1】:

    子上带有merge = true 的父子是spring 支持的。 merge 确实起到了 mixin 的作用(以某种方式收集),对吧?

    【讨论】:

    • 是的,但我试图不存在父子关系并且我的属性不是集合,它只是一组属性,每个属性都可以是任何东西(例如上面的字符串) .
    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多