2014-02-12 9 views
6

Ich bin eine Java Enterprise-Anwendung implementieren und deklarierte einen Filter für jede Anfrage, so wie der Server diese Anfrage verfolgt, erstellen Sie ein neues Filterobjekt für jede Anfrage, oder ihre ist nur ein Filter alle behandelt Anfrage, mit anderen Worten sind Java Webfilter Singletone?Sind Java Filter Singleton

+0

Ich bin nicht sicher, aber init() und destroy() werden nur einmal aufgerufen, aber für jede Anfrage muss sie doFilter durchlaufen ... Dieses Verhalten ist dasselbe wie Servlet-Init, Destroy oder Service-Methoden. – AurA

+0

Related: http://StackOverflow.com/Q/3106452 – BalusC

Antwort

13

Lassen Sie uns zunächst die Definition von Singleton Pattern (Hervorhebung von mir) Bewertung:

In Software-Engineering, das Singleton-Muster ist ein Entwurfsmuster, dass die Instanziierung einer Klasse auf ein Objekt beschränkt.

Wenn Sie eine Klasse deklarieren, die die Filter-Schnittstelle implementiert, braucht es einen public Konstruktor (in der Regel der Standard-Konstruktor), so dass die Anwendungsserver es instanziiert könnte. Somit ist die Filternicht ein Singleton.

Beachten Sie, dass der Anwendungsserver eine einzelne Instanz pro Anwendungskontext z. per einer bereitgestellten Webanwendung, aber das ist nicht dasselbe wie mit einem Singleton. Warum? Weil Sie oder ein anderer Programmierer unvorsichtigerweise eine Instanz dieser Klasse erstellen können (auch wenn sie die Instanz nicht verwendet).

+2

Kein Singleton, aber im Wesentlichen äquivalent zu "@ApplicationScoped" in CDI. –

+0

@exabrial ja, das stimmt –

0

Die Antwort hängt davon ab, wie Sie es in web.xml definieren.

Zum Beispiel dieses Fragment von web.xml, erstellen Sie ein Objekt von Filter1

<filter> 
     <filter-name>Filter1</filter-name> 
     <filter-class>com.surasin.test.Filter1</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>Filter1</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Aber diese framgemet von web.xml, erstellen Sie zwei Objekte von Filter1

<filter> 
     <filter-name>Filter1</filter-name> 
     <filter-class>com.surasin.test.Filter1</filter-class> 
     <init-param> 
      <param-name>my-param</param-name> 
      <param-value>my-param-value</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>Filter1</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
    <filter> 
     <filter-name>Filter1</filter-name> 
     <filter-class>com.surasin.test.Filter1</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>Filter1</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping>