在Filter的init方法中获得WebApplicationContext并调用getBean(String)方法.
这里的知识点就是如何在ServletContext中获得Spring的ApplicationContext:
public void init(FilterConfig filterConfig) throws ServletException { ServletContext sc = filterConfig.getServletContext(); WebApplicationContext wac = (WebApplicationContext) sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE); //获得WebApplicationContext还可以调用 //WebApplicationContextUtils.getWebApplicationContext(sc); //当然最后Spring都是调用getAttribute方法. this.myManager = (MyManager) wac.getBean("myManager"); }
使用Spring的Filter代理类org.springframework.web.filter.DelegatingFilterProxy来实现.
然后在Spring的xml配置文件里将属性注入.
首先在web.xml里面配置Filter
<filter> <filter-name>MySpringFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <param-name>targetBeanName</param-name> <param-value>myFilter</param-value> </init-param> </filter> <filter-mapping> <filter-name>MySpringFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
userFilter则是我们自己的Filter在Spring中bean的name.
然后在Spring的xml配置文件中配置:
<bean id="myFilter" class="filter.MyFilter"> <property name="myManager" ref="myManagerInSpring"></property> </bean>
原本想实现ApplicationContextAware接口,但是现在有些东西还需要测试.目前的方案是想办法获得ServletContext.如果谁知道如何用Spring自动管理Listener请吼我.