1

次のクラスがあるとします...

@Controller
public class WebController {
    @Autowired PersonService personService;


    @RequestMapping(value = "/get", method = RequestMethod.GET)
    @ResponseBody
    @Scope("session")
    public List<Player> getPerson(String personName) {
        return playerService.getByName(personName);
    }
}

これにより、次のサービスが呼び出されます...

@Service("playerService")
public class PlayerServiceImpl implements PlayerService {
private List<Player> players;
@Override
    @Transactional
    public List<Player> getByName(final String name) {
        if (players == null) {
            players = getAll();
        }
        return getValidPlayers(name);
    }

最初にアプリケーションを起動した場合、players は正しく null ですが、同じセッションで新しい値を指定してこのメ​​ソッドを再度呼び出すと、ご想像のとおり、players は null ではなくなりました。ただし、新しいスレッドが作成されているようには見えません。新しいブラウザー ウィンドウを開いて (新しいセッションを作成)、このメソッドを呼び出しても、前のセッションの値が保持されています。

@Scope("session") がスレッドプールに新しいスレッドを作成しないのはなぜですか?

サーブレット コンテキストで期待どおりに指定<context:component-scan base-package="com." />しました。Java EE コンテナーのようにセッションごとに新しいスレッドを作成するのではなく、サービス メソッドがすべてシングルトンとして機能することを除けば、すべて正常に動作します。

プレイヤーが静的としてマークされていれば、理解できます。

また、コントローラーを次のようにマークしようとしましたが@Scope("session")(以下に示すように)、これも影響がないようです。Spring アプリに新しいセッション用の新しいスレッドを作成させる最良の方法は何ですか?

@Controller
@Scope("session")
public class PlayerController {
4

2 に答える 2

3

@Scope注釈を間違った方法で使用しています。

ドキュメントの引用:

Component アノテーションと組み合わせてタイプレベルのアノテーションとして使用する場合、アノテーションが付けられたタイプのインスタンスに使用するスコープの名前を示します。

Bean アノテーションと組み合わせてメソッド レベルのアノテーションとして使用する場合、メソッドから返されるインスタンスに使用するスコープの名前を示します。

したがって、Java config を使用している場合は、Spring コンポーネント Bean または Bean を作成するメソッドのいずれかに注釈を付けることができます。Java構成がコンパイルさえする唯一の理由です(3.0以前の春にはそうではありませんでした)

あなたの場合、その注釈は何も意味しない通常の Bean メソッドにあります。

適切な問題を解決する

にクエリ結果を格納して db キャッシュを実装しようとしているようですList<Player> players

そうしないでください。代わりに、事前に構築されたキャッシュの抽象化 (Spring には非常に優れたものがあります) の 1 つを使用してください。

では、どこに行くべき@Scopeですか?

で注釈@Controllerを付けて@Scope("session")も、セッション スコープのコントローラーが作成されるため役に立ちませんが、注入されたサービスはまだシングルトンです。

Service Bean のみに注釈を付けても機能しません。原因@Controllerはシングルトンであり、その依存関係はアプリケーションの起動時に自動配線されます。

との両方に注釈を付ける@Service@Controllerうまくいくかもしれませんが、少し面倒です。

状態はまったく避けたほうがよいでしょう。

于 2013-05-12T19:14:07.473 に答える