2012-01-15 25 views
7

私のアプリではMyServiceにAutowiredされたUser beanを使用しています。これはユーザーの情報にログインする原則として使用されています(つまり、ユーザーは静的Beanとしてxmlですが、ログインしたユーザーから動的に生成されます)ログインしたユーザーが10人いる場合は、@AutoWiredUserフィールドに10人の候補があります。 (右?)と私はそれらのいずれかを取得することができますので、AutoWiredは、春のコンテナではなく、セッションで表示されます。Spring @Autowired confusion(コンテナまたはセッション)

私がこれに間違っているかどうかを教えてください。可能であれば実際にそれを解決する方法。しかし、私のAutoWiredフィールドがこのよう@Scope ("Session")

でアノテートされた場合にどのような:

@Component("user") 
@Scope("session") 
public class User 
{ 
String userid; 
String name; 
//getter setters etc 
} 

@Component 
public class MyService 
{ 
    @Autowired 
    private User user; 

} 

は、それは私が私のMyServiceコンポーネントを呼び出したときに、いくつかの他のユーザーのユーザーBeanを取得することが可能です。たとえUser@Scope(session)であっても、Cos MyService@Componentです。

基本的には(もし私が私の前提に間違っていると)私はあなたが@Autowireフィールドを見ていると、コンテナ全体を見ており、コンテナはセッションごとにサブコンテナに分割されていないと思います。あなたは別の非スコープのコンポーネントに、春はMyServiceUserの間に位置するプロキシを生成すること@Scope("session")、その後@AutowireUserに注釈を付ける

答えて

11

。このプロキシは、現在のセッションからUserを探し出し、MyServiceのコールをプロキシにセッションスコープのUserに委任します。

だから、それは完全に安全だ、MyServiceコンポーネントは、現在のセッションからUserにアクセスする必要があります。

プロキシ処理が行われなかった場合は、セッションスコープのBeanをシングルトンスコープのBeanに直接挿入できないため、コンテナが開始できませんでした。

+0

私は 'SpringUtils.getContext(req).getBean(" myservice ")'を実行すると、現在のセッションにない他のユーザBeanを取得します。 – sarmahdi

+1

@sarmahdi:そうです。現在のユーザーのセッションは、Springによってメンテナンスされているスレッドローカル変数です。 – skaffman

+0

私は 'SpringUtils.getContext(req).getBean(" myservice ")'を実行すると、現在のセッションにない他のユーザBeanを取得することはできません。 実際に私はこの問題を抱えてページを読み込んだので、他のユーザーの詳細があります。だから私はそれがユーザーがセッションであるにもかかわらず、サービスがそうではなく、非スコープのセッションがデフォルトでシングルトンであっても、それがcosであるかもしれないと考えていた。 – sarmahdi

11

春は自動的にプロキシを作成しません。あなたは、これは、セッションBeanがシングルトンクラスにautowiredなっているとき、プロキシがからBeanを取得するために責任を負うことになる豆を中心に作成されていることを保証するであろう次

@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS) 

にスコープアノテーションを変更する必要がありますセッション。

関連する問題