问题引入今天项目中要统计在线人数与接口访问统计功能,于是准备在以前验证是否登录的filter中添加相关的统计功能,所以要在自定义的filer中注入redis操作类。 起先按照正常操作,使用@Autowired注入操作类,然后。。。就没有然后了。 问题分析出现问题的原因是因为Web容器的初始化过程为Listener -> Filter -> Servlet, 所以在Filter初始化的时候,Spring容器中管理的类都还没初始化,自然不能完成注入。 解决方案在之前Filter是没有交给Spring管理的,只是在web.xml中注册了Filter。 代码如下: <filter>
<filter-name>authFilter</filter-name>
<filter-class>com.diyi.filter.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>authFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> package com.diyi.filter;
public class AuthFilter implements Filter {
//逻辑代码
....
} 现在将Filter交给Spring管理。 代码如下: <filter>
<filter-name>authFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<!-- 使用自定义Filter中的初始化和销毁函数 -->
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>authFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> package com.diyi.filter;
@Component
public class AuthFilter implements Filter {
@Autowired
private ParamUtil paramUtil;
//逻辑代码
...
} 这里我是启动了包扫描,所以使用@Component注解注入类,也可以在applicationContext.xml中使用bean标签注入类: <bean class="com.diyi.filter.AuthFilter"/>
|