2012-08-05 10 views
26

Leyendo un libro que dice que el servlet es singleton desde el lado del contenedor. ¿Es esto cierto?¿Servlet es el singleton?

Sin embargo, incluso que es un producto único, tenemos que manejar etc sincronización de datos

+2

posible duplicado de [¿Cómo funcionan los servlets? Instanciación, variables de sesión y multihebra] (http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading) – BalusC

+2

Un servlet no es un singleton, pero debe tratarlo como singleton: sincroniza o evita atributos de nivel de instancia. Ver [this] (http://stackoverflow.com/questions/6888268/httpservlet-does-not-implement-runnable-or-extend-thhy-why-is-it-thread-able/6888301#6888301) también. – home

Respuesta

14

No. Puede crear la misma clase de servlet varias veces bajo diferentes nombres de servlets y URL en el mismo contenedor web y, de hecho, en la misma aplicación web.

+0

Si solo tengo una regla de asignación para MyServlet en web.xml y no uso la anotación @WebServlet, ¿puedo estar seguro de que siempre habrá solo una instancia de MyServlet en el contenedor? –

+0

@ JimJim2000 No, a menos que también evite el 'SingleThreadModel': vea la otra respuesta. – EJP

23

En cuanto a la definición del patrón Singleton como se define en el Cunningham & Cunningham, Inc. Wiki

Asegurar una clase tiene sólo un ejemplo, y proporcionar un punto de acceso global a él.

Yo diría que no. Desde la perspectiva del contenedor, un objeto servlet es aceptado y administrado, incluida la creación de un ServletContext, pero no impide que no haya más de una instancia del servlet.

En cuanto a estos problemas, creo que es mejor buscar en el contrato correspondiente, que es en el caso de los servlets definidos en el Java Servlet Specification. Han abordado el número de instancias de un servlet.

2,2 Número de instancias

La declaración servlet que es o bien a través de la anotación como describe en el Capítulo 8, “Anotaciones y enchufabilidad” o parte del descriptor despliegue de la aplicación Web que contiene el servlet, como se describe en el Capítulo 14, "Descriptor de implementación", controla cómo el contenedor de servlets proporciona instancias del servlet. Para un servlet no alojado en un entorno distribuido (el valor predeterminado), el contenedor servlet debe usar solo una instancia por declaración de servlet. Sin embargo, para un servlet que implementa la interfaz SingleThreadModel, el contenedor de servlet puede crear instancias de varias instancias para manejar una pesada carga de solicitud y serializar las solicitudes a una instancia particular.

En el caso en que un servlet se desplegó como parte de una aplicación marcado en el descriptor de despliegue como distribuible, un contenedor puede tener sólo una instancia por la declaración de servlets de Java Virtual por Machine (JVM ™). Sin embargo, si el servlet en una aplicación distribuible implementa la interfaz SingleThreadModel, el contenedor puede crear instancias múltiples de ese servlet en cada JVM del contenedor .

Sólo se especifica que el contenedor sólo debe utilizar una instancia (en el primer caso) y como EJP ha señalado en el comentario:

No hay nada en la especificación Servlet eso le impide volver a instanciar la misma clase de servlet con un nombre diferente en la misma aplicación web . Ergo, no es un singleton.

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

+0

Bien investigado, pero no es correcto. No hay nada en la Especificación del servlet que le evite volver a crear una instancia de la misma clase de servlet con un nombre diferente en la misma aplicación web. Ergo, no es un singleton. – EJP

+0

@EJP Estoy de acuerdo con usted. Observar la definición de singleton no está garantizado. –

-2

No, Servlet no es un Singleton. Puede crear 2nd Object, depende de la solicitud entrante y del comportamiento del contenedor.

+4

Esto no agrega nada a las respuestas ya publicadas desde hace casi 2 años. –

Cuestiones relacionadas