введение свойства Spring Bean различных значений в соответствии с его контекстом - PullRequest
0 голосов
/ 13 марта 2012

У меня есть пружинный компонент my_bean со свойством my_map, и я хочу добавить его со значением "X" или со значением "Y". Боб:

<bean id="my_bean">
  <property name="my_map">
    <map>
      <entry key="p" value="X" />
    </map>
  </property>
</bean>

Боб root_a:

ссылается на него в очень глубокой иерархии
<bean id="root_a">
  <ref bean="root_a_a"/>
</bean>
<bean id="root_a_a">
  <ref bean="root_a_a_a"/>
</bean>
<bean id="root_a_a_a">
  <ref bean="my_bean"/>
</bean>

и на всю эту глубокую иерархию снова ссылаются из компонента root_b. В ссылке my_bean из этой иерархии я бы добавил свойство со значением "Y", но не хотел бы дублировать всю иерархию дважды.

<bean id="root_b">
  <ref bean="root_a_a"/>
</bean>

Как мне это сделать в весеннем XML? Можете ли вы придумать умное решение EL пружины? что-то другое? Я предпочитаю, чтобы все мои настройки выполнялись в XML, а не в Java-коде ...

1 Ответ

1 голос
/ 13 марта 2012

По умолчанию bean-компоненты Spring являются синглетонами, что означает, что после создания bean="my_bean" он используется совместно другими компонентами, например, делится между A => bean id="root_a_a_a" и B => bean id="root_b_b_b"

Ответ на ваш вопрос зависит от того, чего именно вы пытаетесь достичь.

Две фасоли

Если bean="my_bean" не нужно делить между A и B, создайте два bean-компонента:

введите это A

<bean id="myBeanX" class="My">
  <property name="culprit" value="X"/>
</bean>

и этот к B

<bean id="myBeanY" class="My">
  <property name="culprit" value="Y"/>
</bean>

обратите внимание, что они оба являются экземплярами одного и того же класса.

Вы также можете включить их в соавторов (A / B), если они вам не нужны ни для чего другого:

<bean id="root_a_a_a">
  <constructor-arg>
    <bean class="My">
      <property name="culprit" value="X"/>
    </bean>
  </constructor-arg>
</bean>

У вас также может быть фабричный компонент, который создает root_a_a_a с учетом свойства для класса My, но это будет излишним.

Боб

В случае, когда A и B необходимо использовать одну и ту же ссылку на bean="my_bean", возникает вопрос: вы согласны с тем, что A и B изменяют состояние my_bean после создания my_bean? Вероятно, не .

Если вы равны , что составляет 0,41172% вероятности, вы можете изменить значение my_bean на то, что вам нужно в конструкторах A или B => будет не рекомендовать

Следовательно, вы либо выбрали бы подход Two Bean (что, скорее всего, то, что вам нужно), либо вам нужно было бы реорганизовать свойство для "X" и "Y" в другой, например. myConfig компонент.


РЕДАКТИРОВАТЬ после редактирования вопроса

Если root_a и root_b будут не использоваться вместе в одном и том же экземпляре контекста, вы можете использовать Spring Profiles ( пример ) или SpEL / Property Based решения ( пример )

* * Например, тысяча шестьдесят-два
<bean id="my_bean">
  <property name="my_map">
    <map>
      <entry key="p" value="${ENV_SYSTEM:X}" />
    </map>
  </property>
</bean>

По умолчанию будет установлено значение X, если не установлена ​​системная переменная ENV_SYSTEM (например, Y).

...