1

新しいBeanの作成に関して1つの小さな問題があります。基本的に、リクエストに従って、Beanに渡す必要のあるいくつかのパラメーターを取得します。以下では、リクエストごとにControllerServiceをインスタンス化しています。むしろ、scope=protypeのBeanにしたいと思います。リクエストごとに新しいオブジェクトを取得できるようにします。しかし、Beanのコンストラクターを介して送信する2つのプロパティ(kpiName、kpiInput)を設定するにはどうすればよいですか?

@Autowired
@Qualifier("serviceManager")
Cleanser serviceManager;  

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody
String getKPIResult(@RequestParam("kpiName") String kpiName,
            @RequestParam("kpiInput") String kpiInput) {    

    return serviceManager.checkAndExecute(new ControllerService(kpiName, kpiInput));
}
4

2 に答える 2

1

しないでください。Spring MVCで意図されているコントローラーは、主に古いJavaサーブレットから派生しており、仕様によりステートレスである必要があります。

実際、Controller-objectsはハンドラーマッピングフレームワーク内にハードキャッシュされ、各リクエストでBeanコンテキストからフェッチされません。スコープを「プロトタイプ」に設定しても、ハンドラー(コントローラー)は実際には1回しか取得されないため、事実上何もしません。

于 2012-10-18T11:12:22.720 に答える
1

春の穀物に逆らうこのような状況では、おそらくベストプラクティスとは見なされない方法で何かをしていることをお勧めします。しかし、これ以上の文脈がなければ、見るのは難しいです。

Spring Socialは、requestスコープBeanを使用して、特定のユーザーのリポジトリーを具体化します。私は今、それが物事を行うのにひどく非効率的な方法であり、私見がはるかに理解しにくいので、なぜかを理解しました。

<bean id="connectionRepository" factory-method="createConnectionRepository"
    factory-bean="usersConnectionRepository" scope="request">
    <constructor-arg
        value="#{T(org.springframework.security.core.context.SecurityContextHolder).getContext().getAuthentication().getPrincipal()}" />
    <aop:scoped-proxy proxy-target-class="false" />
</bean>

ここでは、クラスのインスタンスが必要なときに呼び出すクラス/メソッドの使用factory-beanと宣言を確認できます。factory-methodコンストラクター引数は、SpELを使用して渡されます。Spring MVCがWebリクエストに応答することでこれをどのように達成できるかはよくわかりませんが、Spring Integrationを使用してメッセージを渡し、SpELを使用してそのメッセージからヘッダー/ペイロードを取得してメッセージを渡すことができると確信しています。コンストラクタ。

繰り返しになりますが、ここであなたのデザインパターンに疑問を投げかけます。より一般的なSOAのイディオムは、リクエストごとに特定の状態のインスタンスを作成するのではなく、起動時にサービスを作成し、それ以降は可能な限りステートレスにすることです。頑張ってください!

于 2012-10-18T11:06:10.067 に答える