31

サーブレットはコンテナ側からシングルトンであると書かれた本を読んでいます。これは本当ですか?

ただし、シングルトンであっても、データ同期などを処理する必要があります

4

4 に答える 4

25

Cunningham & Cunningham, Inc. Wiki で定義されているシングルトン パターンの定義を見る

クラスのインスタンスが 1 つだけであることを確認し、そのインスタンスへのグローバルなアクセス ポイントを提供します。

いいえ。コンテナーの観点からは、1 つのサーブレット オブジェクトが受け入れられ、ServletContextの作成を含めて管理されますが、サーブレットの複数のインスタンスが存在しないことは妨げられません。

このような問題に関しては、 Java Servlet Specificationで定義されているサーブレットの場合は、対応する契約を調べるのが最善だと思います。彼らは、サーブレットのインスタンス数に対処しました。

2.2 インスタンス数

第 8 章「アノテーションとプラグ可能性」で説明されているようにアノテーションを介して行われるサーブレット宣言、または第 14 章「デプロイメント記述子」で説明されているように、サーブレットを含む Web アプリケーションのデプロイメント記述子の一部であるサーブレット宣言は、サーブレット コンテナがどのように制御されるかを制御します。サーブレットのインスタンスを提供します。分散環境 (デフォルト) でホストされていないサーブレットの場合、サーブレット コンテナーは、サーブレット宣言ごとに 1 つのインスタンスのみを使用する必要があります。ただし、SingleThreadModel インターフェイスを実装するサーブレットの場合、サーブレット コンテナーは複数のインスタンスをインスタンス化して、重い要求の負荷を処理し、要求を特定のインスタンスにシリアル化する場合があります。

デプロイメント記述子で配布可能としてマークされたアプリケーションの一部としてサーブレットがデプロイされた場合、コンテナーは、Java 仮想マシン (JVM™) ごとのサーブレット宣言ごとに 1 つのインスタンスしか持つことができません。ただし、配布可能なアプリケーションのサーブレットが SingleThreadModel インターフェースを実装している場合、コンテナーはコンテナーの各 JVM でそのサーブレットの複数のインスタンスをインスタンス化することがあります。

コンテナが(前者の場合)1つのインスタンスのみを使用する必要があることを指定するだけで、EJPがコメントで指摘したように:

サーブレット仕様には、同じ Web アプリで同じサーブレット クラスを別の名前で再インスタンス化することを妨げるものは何もありません。したがって、シングルトンではありません。

Java サーブレット仕様 3.0 MRを参照(p.6-7)

于 2012-08-05T23:10:49.027 に答える
15

いいえ。同じ Web コンテナー内、実際には同じ Web アプリ内で、異なるサーブレット名と URL で同じサーブレット クラスを何度もインスタンス化できます。

于 2012-08-05T23:56:21.333 に答える
-1

いいえ、サーブレットはシングルトンではありません。受信リクエストとコンテナの動作に応じて、 2 番目のオブジェクトが作成される場合があります。

于 2014-06-11T19:12:09.450 に答える