問題引入
今天項目中要統計線上人數與接口通路統計功能,于是準備在以前驗證是否登入的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标簽注入類: