天天看點

SSM項目中Filter使用@Autowired注入bean問題引入問題分析解決方案

問題引入

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

繼續閱讀