Spring - включая несколько наборов свойств в bean-компонент - PullRequest
1 голос
/ 08 февраля 2012

Скажем, у меня есть следующий компонент:

<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>

(пример из здесь ).Если есть доступ к разным серверам, это может быть случай, когда они используют один и тот же драйвер (так что driverClassName будет общим), и это также может быть случай, когда они используют одинаковые учетные данные (таким образом, username и password будет общим).Я хотел бы сделать что-то вроде:

<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-компонента.

Мнения о том, почему выполнение вышеизложенного не было бы хорошим или альтернативные способы сделать это, приветствуются.

1 Ответ

0 голосов
/ 08 февраля 2012

Родительский ребенок с merge = true на ребенке - это тот, который поддерживается весной.merge действует как миксин (в смысле для коллекций), верно?

...