0

my_beanプロパティを持つSpring Beanがmy_mapあり、値「X」または値「Y」を注入したいと考えています。豆:

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

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>

そして、この深い階層全体が Bean から再び参照されますroot_b。この階層からの my_bean の参照では、プロパティに値「Y」を挿入しますが、階層全体を 2 回複製したくありません。

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

春のXMLでこれを行うにはどうすればよいですか? 賢い春のELソリューションを思いつくことができますか? 他の何か?すべての構成を XML で行い、Java コードを使用しないことを好みます...

4

1 に答える 1

1

デフォルトでは、Spring Bean はシングルトンです。つまり、bean="my_bean"作成されると、他のコンポーネント間で共有されます。たとえば、A =>bean id="root_a_a_a"と B =>間で共有されます。bean id="root_b_b_b"

あなたの質問への答えは、あなたが何を達成しようとしているのかによって異なります。

2 つの豆

bean="my_bean"A と B の間で共有する必要がない場合は、2 つの 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_aclass のプロパティを指定して作成するファクトリ Bean を使用することもできますがMy、それはやり過ぎです。

シングルビーン

A と B が へのまったく同じ参照を共有する必要がある場合、問題は、が作成された後bean="my_bean"に A と Bがmy_beanの状態を変更してもよろしいですか? my_beanおそらくそうではありません

場合、0.41172% の確率で、my_beanA または B のコンストラクターで の値を必要なものに変更できます =>お勧めしません

したがって、アプローチを使用するかTwo Bean(これが最も可能性が高い)、「X」と「Y」のプロパティを別のmyConfigコンポーネントなどにリファクタリングする必要があります。


質問が編集された後に編集

root_aコンテキストの同じインスタンスでとを一緒に使用しない場合root_bは、Spring プロファイル ( example )、または SpEL / プロパティ ベースのソリューション ( example )を使用できます。

例えば

<bean id="my_bean">
  <property name="my_map">
    <map>
      <entry key="p" value="${ENV_SYSTEM:X}" />
    </map>
  </property>
</bean>

XENV_SYSTEM システム変数が設定されていない限り (たとえば に)、デフォルトで に設定されますY

于 2012-03-13T18:22:35.003 に答える