2

私が理解しているように、Spring MVCコントローラーはデフォルトでスレッドセーフです(サーブレットのように)。しかし、コントローラー内のプライベートヘルパーメソッドがスレッドセーフであることを知りたいだけですか?

コントローラー クラスには、/test と test/success などの 2 つのマッピングがあります。ユーザーがこの URL を呼び出すたびに、サービス メソッド (2 つの異なる呼び出し) を使用してデータベース内のユーザー ステータスとアクティベーション時間を確認したいと考えています。そこで、ステータスを確認するためのプライベート ヘルパー メソッドを 1 つ作成することにしました。私のプライベートメソッドがスレッドセーフであることを誰かが知っているでしょうか?

4

1 に答える 1

4

すべてのリクエストは、コントローラーの 1 つのインスタンス (Spring Managed Bean であるためシングルトン) によって処理されます。そのため、1 つのリクエストに関連する状態を (フィールドに) 保存しないようにする必要があります。

そう:

@Controller
@RequestMapping("/foo")
public class Foo {
    @Autowired
    private Something something;

    @RequestMapping("/list")
    public String foo() {
       something.someMethod();
       bar();
       return "view"
    }

    private void bar() {
        // something
    }
}

は問題ありませんが、次のとおりです。

@Controller
@RequestMapping("/foo")
public class Foo {

    private User theUser; // problem is ALL request share this field

    @RequestMapping("/foo/{userId}")
    public String foo(@PathVariable final Integer userId) {
       if (theUser.getId().equals(userId)) {
           // something
       } else {
           theUser = ...
       }
       return "view"
    }
}

ではありません。

注意:テストされていません(ここに入力しただけなので、コンパイラに害を及ぼす可能性さえあります)

于 2013-10-03T20:04:51.023 に答える