スプリング3マネージドJSFアプリのセッション豆、プロキシ、シングルトンに関する範囲の混乱
-
09-10-2019 - |
質問
これは基本的な春101のもののようですが、私は見つけることができないようです 正しい これを行う方法。状況は次のとおりです。私のWebアプリには、外部システムから来るユーザーを処理するコントローラーである単一のエントリポイントがあります。転送はただのものです POST
そのユーザーに関連する関連情報の束でリクエストします。 APONエントリ、新しいユーザーBeanを作成して、そのユーザー情報をロードする必要があります。さらに、ユーザーがいくつかのサービスをトリガーするビューをヒットすると、適切なユーザーBeanインスタンスにアクセスできるようにそのサービスが必要です。
頭に浮かぶ最初の方法は、ユーザーの新しいインスタンスを作成し、データを入力し、ユーザー名をBean名としてスプリングコンテナに登録するUserManagerサービスを用意することでした。その後、サービスが呼び出されると、サービスは Factory.getBean(username)
適切なものを見つける User
実例。私がここで見ている問題は、私がユーザーの間のリンクを失っているということです。 User
豆は彼らに属します。さらに、可能であれば、ユーザーにセッションで豆を持ち歩くことを避けたいと思います。これは私がSpring AOPとプロキシを使用することになっている場所ですか?
このタイプの状況を解決するための典型的な春のパターンは何ですか?
解決
だから今は何週間も後(この質問をしてから)であり、その結果、私の知識レベルは指数関数的に拡大しているので、私はそれが役に立つかもしれない人のために私の質問に答えるかもしれないと思いました(言うまでもなく、質問は言うまでもありませんそもそも非常に明確です)。
基本的な答えは、プロキシを使用します。シングルトンは1回だけインスタンス化されているため、寿命が短い別のクラスを注入することはできません。セッションスコープ。より多くの情報を必要とする人のために、ステートレス豆とステートレス豆をチェックアウトしてください。多かれ少なかれ、私がやったことはこれです...サービスには、データを操作するためのステートレスコードが含まれています(動詞、RegisterUsersVC、AddPartSVCなど)。これらのサービスが操作するデータはステートフルです。たとえば、各ユーザーには独自のデータオブジェクトのコピーがあります。これは、各ユーザーの異なる状態にあるTodolistBeanとしましょう。
では、たとえば、サービス、AddToDoItemServiceはこのデータをどのように操作しますか?これがプロキシが出てくる場所です。インスタンス化されると、addToDoItemServiceは、実際のオブジェクトではなく、トドリストビーンのプロキシで注入されます。そうすれば、サービスがTodolistBeanにアクセスする必要がある場合、コンテナは現在のユーザーセッションからA TodolistBeanを提供するため、サービスは正しいBeanで動作します(ユーザーがサービスを呼び出したものに基づいて)各ユーザーセッションの範囲に含まれるサービスの多数のコピーを持っているように愚かです。