自定义Filter类中不能注入service、dao

当我们需要在自定义Filter类中注入service or dao时,我们可以通过以下的方式实现。

1、编写自定义的CustomFilter类(基于注解的),实现Filter接口,重写init、doFilter、destroy方法。

@Component
public class CustomFilter implements Filter {

    @Autowired
    private UsersService usersService;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println(usersService);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        
    }

    @Override
    public void destroy() {

    }
}

2、配置web.xml



	
	
		springmvc
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			classpath:springmvc-servlet.xml
		
		1
	
	
		springmvc
		/*
	
	
	
		CharacterEncodingFilter
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
		
			forceEncoding
			true
		
	
	
		CharacterEncodingFilter
		/*
	
	
	
		customFilter
		org.springframework.web.filter.DelegatingFilterProxy
	
	
		customFilter
		/xx/xx/xxxAdd
	

3、springmvc-servlet.xml配置

添加: ,如果使用xml装配的方式,可以直接爱配置文件中添加

,CustomFilter类中去掉注解。

注意:bean的name要和web.xml中的一样。

4、测试输出usersService 的地址(表示注入成功)

com.xxx.xxx.service.UsersService@18c72234

5、总结

观察web.xml 自定义过滤器的配置中“DelegatingFilterProxy” ,DelegatingFilterProxy是对servlet filter的代理,用这个类的好处主要是通过Spring容器来管理servlet filter的生命周期,还有就是如果filter中需要一些Spring容器的实例,可以通过spring直接注入,另外读取一些配置文件这些便利的操作都可以通过Spring来配置实现。
如果要保留Filter原有的init,destroy方法的调用,还需要配置初始化参数targetFilterLifecycle为true,该参数默认为false。


		compareTaskFilter
		org.springframework.web.filter.DelegatingFilterProxy
		
	        targetFilterLifecycle
	        true
    	

 

你可能感兴趣的:(Java)