2012-08-05 10 views
26

Czytanie książki, która mówi, że serwlet jest singleton od strony kontenera. Czy to prawda?Czy serwlet to singleton?

Jednak nawet to jest pojedyncza, musimy obsłużyć synchronizacji danych itp

+2

możliwy duplikat [Jak działają serwlety? Tworzenie, zmienne sesji i wielowątkowość] (http://stackoverflow.com/questions/3106452/how-do-servlets-work-instantiation-session-variables-and-multithreading) – BalusC

+2

Serlet nie jest singletonem, ale powinieneś leczyć jako singleton: synchronizuj lub unikaj atrybutów poziomu instancji. Zobacz również [this] (http://stackoverflow.com/questions/6888268/httpservlet-does-not-implement-runnable-or-extend-thread-why-is-it-threadable/6888301#6888301). – home

Odpowiedz

14

Nie. Można utworzyć instancję tej samej klasy serwletów wiele razy pod różnymi nazwami serwletów i adresami URL w tym samym kontenerze internetowym i rzeczywiście w tej samej aplikacji internetowej.

+0

Jeśli mam tylko jedną regułę mapowania dla MyServlet w web.xml i nie używam adnotacji @WebServlet, czy mogę mieć pewność, że zawsze będzie tylko jedno wystąpienie MyServlet w kontenerze? –

+0

@ JimJim2000 Nie, chyba że unikniesz też 'SingleThreadModel': zobacz drugą odpowiedź. – EJP

23

Patrząc na definicję wzoru Singleton, jak określono w Cunningham & Cunningham, Inc. Wiki

Zapewnienie klasa ma tylko jedną instancję, a zapewnić globalny punkt dostępu do niego.

Powiedziałbym, że nie. Z perspektywy kontenera jeden obiekt serwletu jest akceptowany i zarządzany, łącznie z tworzeniem ServletContext, ale nie wyklucza, że ​​nie ma więcej niż jednego wystąpienia serwletu.

Jeśli chodzi o takie kwestie, uważam, że najlepiej jest spojrzeć na odpowiednią umowę, co ma miejsce w przypadku serwletów zdefiniowanych w Java Servlet Specification. Zaadresowały liczbę wystąpień serwletu.

2,2 Ilość wystąpień

Deklaracja aplet, który jest albo za pośrednictwem adnotacji jako opisanego w Rozdziale 8, „Adnotacje i Plugging” lub część deskryptora rozmieszczania aplikacji sieci Web zawierającej servlet, , jak opisano w rozdziale 14, "Deskryptor wdrażania", kontroluje, w jaki sposób kontener serwletu udostępnia instancje serwletu. Dla serwletu, który nie jest hostowany w środowisku rozproszonym (ustawienie domyślne), kontener serwletu musi używać tylko jednej instancji na deklarację serwletu. Jednak w przypadku serwletu implementującego interfejs SingleThreadModel , kontener serwletu może tworzyć instancje wielu instancji, aby obsłużyć duże żądanie żądania i szeregować żądania do określonej instancji.

W przypadku gdy aplet został wdrożony jako część aplikacji oznaczonego w deskryptorze wdrażania jako dystrybuowana, pojemnik może mieć tylko jedną instancję za deklaracji apletu Java Virtual za maszynę (JVM ™). Jednakże, jeżeli serwlet w dystrybuowalnej aplikacji implementuje interfejs SingleThreadModel, pojemnik może tworzyć instancje wielu wystąpień tego serwletu w każdej maszynie JVM kontenera .

Określa jedynie, że pojemnik musi używać tylko jednej instancji (w pierwszym przypadku) i jako EJP wskazał w komentarzu:

Nie ma nic w specyfikacji Servlet to uniemożliwia ponowną instancję tej samej klasy serwletu pod inną nazwą w tej samej aplikacji internetowej. Ergo, nie singleton.

odniesieniaJava Servlet Specification 3.0 MR (s.6-7)

+0

Dobrze zbadane, ale niepoprawne. W specyfikacji serwletu nie ma nic, co uniemożliwiłoby ponowne utworzenie instancji tej samej klasy serwletu pod inną nazwą w tej samej aplikacji internetowej. Ergo, nie singleton. – EJP

+0

@EJP Zgadzam się z tobą. Przyjrzenie się definicji singleton nie jest zapewnione. –

-2

Nie, serwlet nie jest singletonem. Może utworzyć drugi obiekt, w zależności od przychodzącego żądania i zachowania kontenera.

+4

To nie dodaje nic do już opublikowanych odpowiedzi sprzed prawie 2 lat. –