2

3 つの異なるエンティティの処理を行うフローがあります。したがって、共通のフロー状態を持つ親フロー定義があり、具体的なフロー定義では、そのフローを実際のデータとアクションの実装で拡張します。

エンティティを処理する Bean インスタンスを変数に格納したいので、親フロー定義でこの変数にアクセスできます。

親フロー定義内

<action-state id="prepareReview" >
    <evaluate expression="processor.prepare(modelInstance)" />
    <transition to="check" />
</action-state>

具体的なフロー定義では、

<on-start>
    <set name="flowScope.processor" value="concreteProcessor"/>
</on-start>

concreteProcessor必要な処理を実装するシングルトン Bean はどこにありますか。ステートレスであるため、シリアル化しても意味がありません。さらに、実装がシリアル化できない HibernateDaoSupport を使用する autowired dao 変数が含まれています。

この問題を克服する方法はありますか? 私は 1 つの解決策を持っていますが、具体的なプロセッサ メソッド呼び出しのすべての具体的なフロー定義定型コードを記述する必要があるため、あまり便利ではありません。

<action-state id="prepareReview" parent="common#prepareReview">
    <evaluate expression="concreteProcessor.prepare(modelInstance)" />
</action-state>

それは少し面倒です。

4

1 に答える 1

0

でスコープ プロキシを使用できますConcreteProcessor

@Component
@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS,value=ConfigurableBeanFactory.SCOPE_SINGLETON)

これにより、 の実際のインスタンスの代わりに CGLIB プロキシが挿入されますConcreteProcessor。Proxy はシリアライズ可能であり、デシリアライズ時に依存関係を再注入します。

欠点は、クラスパスに CGLIB が必要なことです。または、インターフェースベースのプロキシを使用します

@Scope(proxyMode=ScopedProxyMode.INTERFACES,value=ConfigurableBeanFactory.SCOPE_SINGLETON)

ただしConcreteProcessor、インターフェイスを実装する必要があります。

于 2013-01-31T19:04:19.273 に答える