与えられた
@Controller
public class MyController {
@RequestMapping(value = "/index")
public String respond() {
return "index";
}
}
Spring は のインスタンスを作成しますMyController
。これは、Spring が構成を解析し、<mvc:annotation-driven>
(の@Controller
ように@Component
) を参照し、注釈付きクラスをインスタンス化するためです。それも見るので@RequestMapping
、そのための を生成します。こちらのドキュメントHandlerMapping
を参照してください。
が受信するすべての HTTP 要求は、登録済みの beforeDispatcherServlet
を介してこのコントローラー インスタンスにディスパッチされ、そのインスタンスの Java リフレクションを介して呼び出されます。HandlerMapping
respond()
次のようなインスタンスフィールドがある場合
@Controller
public class MyController {
private int count = 0;
@RequestMapping(value = "/index")
public String respond() {
count++;
return "index";
}
}
count
多くのスレッドによって変更される可能性があり、変更が失われる可能性があるため、危険です。
サーブレット コンテナの仕組みを理解する必要があります。コンテナーは、Spring MVC の 1 つのインスタンスをインスタンス化しますDispatcherServlet
。コンテナは、接続に応答するために使用するスレッドのプールも管理します。HTTP リクエスト。そのようなリクエストが到着すると、コンテナーはプールからスレッドを選択し、そのスレッド内で、 Spring が (構成から) 登録した正しいインスタンスにディスパッチするservice()
メソッドを実行します。DispatcherServlet
@Controller
はい、Spring MVC クラスはスレッドセーフでなければなりません。これを行うには、クラス インスタンス フィールドのさまざまなスコープを試すか、代わりにローカル変数を使用します。それができない場合は、コード内の重要なセクションの周りに適切な同期を追加する必要があります。