2012-08-05 4 views
26

Lesen eines Buches, das besagt, dass das Servlet Singleton von der Containerseite ist. Ist das wahr?Ist Servlet das Singleton?

aber auch ist es ein Singleton, müssen wir die Datensynchronisation usw.

+2

mögliches Duplikat von [Wie funktionieren Servlets? Instanziierung, Sitzungsvariablen und Multithreading] (http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading) – BalusC

+2

Ein Servlet ist kein Singleton, aber Sie sollten behandeln es als Singleton: Synchronisieren oder vermeiden Sie Instanz-Level-Attribute. Siehe auch [http://stackoverflow.com/questions/6888268/httpservlet-does-not-implement-runnable-or-e-tend-thread-why-is-it-thread-able/6888301#6888301]. – home

Antwort

14

Nein. Sie können die selbe Servlet-Klasse mehrmals unter verschiedenen Servlet-Namen und URLs im selben Webcontainer und tatsächlich in derselben Webanwendung instanziieren.

+0

Wenn ich nur eine Zuordnungsregel für MyServlet in web.xml und keine @WebServlet-Annotation verwende, kann ich sicher sein, dass immer nur eine Instanz von MyServlet im Container vorhanden ist? –

+0

@ JimJim2000 Nicht, außer Sie vermeiden auch das 'SingleThreadModel': siehe die andere Antwort. – EJP

23

Mit Blick auf die Definition des Singleton-Muster zu handhaben, wie in der

Cunningham & Cunningham, Inc. Wiki definiert Stellen Sie sicher, eine Klasse nur eine Instanz hat, und Bereitstellen eines globalen Zugangspunkts.

Ich würde sagen, nein. Aus der Perspektive des Containers wird ein Servlet-Objekt akzeptiert und verwaltet, einschließlich der Erstellung einer ServletContext, aber es verhindert nicht, dass es nicht mehr als eine Instanz des Servlets gibt.

In Bezug auf solche Probleme denke ich, es ist am besten, in den entsprechenden Vertrag zu schauen, der im Falle von Servlets in der Java Servlet Specification definiert ist. Sie haben die Anzahl der Instanzen eines Servlets angesprochen.

2,2 Anzahl der Instanzen

Die Servlet Erklärung, die entweder über die Annotation als in Kapitel 8 beschrieben, „Annotationen und Steckbarkeit“ oder einen Teil des Deployment Descriptor von der Web-Anwendung enthält, die servlet, , wie in Kapitel 14, "Implementierungsdeskriptor" beschrieben, steuert, wie der Servletcontainer Instanzen des Servlets bereitstellt. Für ein Servlet, das nicht in einer verteilten Umgebung (der Standard) gehostet wird, muss der Servlet Container nur eine Instanz pro Servlet-Deklaration verwenden. Jedoch für ein Servlet, das die SingleThreadModel-Schnittstelle implementiert, kann der Servlet-Container mehrere Instanzen instanziieren, um eine schwere Anforderung Anforderung zu bearbeiten und Anforderungen an eine bestimmte Instanz serialisieren.

In dem Fall, dass ein Servlet als Teil einer Anwendung markierte im Deployment Descriptor als ausschüttungs eingesetzt wurde, hat ein Behälter kann nur eine Instanz pro Servlet-Deklaration pro Java Virtual Machine (JVM ™). Wenn das Servlet in einer verteilbaren -Anwendung jedoch die SingleThreadModel-Schnittstelle implementiert, kann der Container mehrere Instanzen dieses Servlet in jeder JVM des -Containers instanziieren.

Es gibt nur, dass der Behälter nur eine Instanz (im ersten Fall) verwenden muß und wie EJP hat im Kommentar darauf hingewiesen:

Es gibt nichts in der Servlet-Spezifikation das verhindert, dass Sie von die gleiche Servlet-Klasse unter einem anderen Namen in der gleichen Web-App wieder instanziieren. Ergo, kein Singleton.

ReferenzJava Servlet Specification 3.0 MR (p.6-7)

+0

Gut recherchiert, aber nicht korrekt. In der Servlet-Spezifikation gibt es nichts, was verhindert, dass Sie dieselbe Servlet-Klasse unter einem anderen Namen in derselben Web-App erneut instanziieren können. Ergo, kein Singleton. – EJP

+0

@EJP Ich stimme dir zu. Sieht man sich die Singleton-Definition an, ist dies nicht gewährleistet. –

-2

Nein, Servlet ist kein Singleton. Es kann 2nd Object erstellen, hängt von der eingehenden Anfrage und dem Verhalten des Containers ab.

+4

Dies fügt den bereits geposteten Antworten vor fast 2 Jahren nichts hinzu. –

Verwandte Themen