Wenn man einen ServletFilter für die eigene Webapp baut, dann muss man drei Methoden des Interfaces implementieren: init(), doFilter() und destroy(). Der Filter wird danach in die web.xml aufgenommen und startet zusammen mit der Webapp, wobei beim Starten des Filters seine init()-Methode aufgerufen wird.

So weit die Theorie. Spring ermöglicht es, Filter im ApplicationContext zu definieren und ihnen damit Zugriff auf andere Beans zu bieten. Über die Namenskonvention Filtername == BeanId wird nun nicht mehr die Filterklasse in der web.xml eingetragen, sondern eine Klasse aus Spring:

 <filter>
   <filter-name>beispielFilter</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
 </filter>
 <filter-mapping>
   <filter-name>beispielFilter</filter-name>
   <url-pattern>/*</url-pattern>
 </filter-mapping>

Ärgerlicherweise führt diese per Default nicht die init()– und destroy()-Methoden aus. Im JavaDoc findet sich der entscheidende Hinweise: Ein init-Parameter muss in der web.xml gesetzt werden, damit der Filter-Lifecycle durchgeführt wird. Dies sieht am Ende so aus:

 <filter>
   <filter-name>beispielFilter</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
   <init-param>
     <param-name>targetFilterLifecycle</param-name>
     <param-value>true</param-value>
   </init-param>
 </filter>