2

Spring に問題があります。Bean の同じインスタンスを 2 回再利用する必要がありますが、シングルトンにする必要はありません。

簡単な ApplicationContext を次に示します。

<bean class="a.b.c.Provider" id="defaultProvider" scope="prototype">
    <constructor-arg ref="lifecycle" />
    <constructor-arg ref="propertySetter" />
</bean>

<bean name="lifecycle" class="a.b.c.Lifecycle" scope="prototype">
        <constructor-arg ref="someParam" />
        ... and more args
</bean>

<bean id="propertySetter" class="a.b.c.PropertySetter" scope="prototype">
    <constructor-arg ref="lifecycle" />
</bean>

したがって、内部で完全に初期化する必要がありProvider、これにはhaveと同じ への参照が含まれている必要があります。LifecyclePropertySetterPropertySetterLifecycleProvider

lifecycleとをシングルトンとして定義するとpropertySetter、大きな問題が発生します。複数の を作成すると、クラスProviderのすべてのインスタンスがProvider同じライフサイクルとプロパティ セッターを共有し、アプリケーション ロジックが壊れてしまうからです。

すべての Bean をプロトタイプとして定義しようとすると、中Providerと中のライフサイクルPropertySetterが同じではありません => 例外が再び発生します。

私には1つの解決策があります: JavaコンストラクターProviderのみに渡して内部Lifecycleで作成することです(を拡張することにより)。それはうまく機能していますが、私のローカル環境でのみです。プロダクション コードでは 3ptyクラスを拡張できないため、このソリューションは使用できません。PropertySetterProviderProviderProvider

この状況で何をするのが最も適切か教えてください。

4

1 に答える 1

1

延長する必要はありませんProviderProviderFactoryを参照してlifecycle作成PropertySetterし、次に作成する独自のものを作成するだけProviderです。

public class ProviderFactory {

  public static create(Lifecycle lc) {
    return new Provider(lc, new PropertySetter(lc));
  }
}

春の宣言は次のとおりです。

<bean id="defaultProvider" scope="prototype" 
      class="a.b.c.ProviderFactory" factory-method="create">
    <constructor-arg ref="lifecycle" />
</bean>
于 2012-10-05T13:45:37.750 に答える