web过滤器使用spring依赖注入

本文探讨了在Web项目中使用Filter过滤器时遇到的Spring Bean注入失败的问题,并提供了详细的解决方案,包括利用DelegatingFilterProxy类实现filter和application.xml之间的交互。

1.问题描述

  在web项目中,使用filter过滤器十分常见,但是在过滤器中spring Bean即使在配置文件中配置了扫描filter对应的包,也无法正确注入spring 管理的Bean。

 

2.原因

  大概如下<摘自知乎>:

  这其中涉及到web启动的原理。
  众所周知,web应用启动的顺序是:listener->filter->servlet,而因为项目应用了spring mvc,所以我们会有两个配置文件(applixationContext.xml和springMVC-sevlet.xml),我们在配置 spring时会用到spring的listener,它会读取application.xml里的配置对spring context进行初始化;而springMVC-servlet.xml则是在spring mvc的dispathServlet启动的时候读取进行配置。而如果项目里用到了注解,则需要在springMVC-servlet.xml中加上“”。
  进入重点。 问题就是项目启动时,先初始化listener,因此配置在applicationContext.xml里的bean会被初始化和注入;然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。所以,如果想要在filter里注入注解bean的话,就要在applicationContext.xml里配置context,也就是上面说的那句配置。在这里配置时需要注意的是,需要把tx和aop的配置放在最下面,否则也会导致spring的context初始化失败。 把配置弄好之后,我们就在filter的init方法里,通过获取webApplicationContext的getBean方法对需要的bean进行注入。
  以上是个人折腾了很久后的总结,希望能帮助到同样遇到这问题的小伙伴们……
 
 
3.解决方案
  利用DelegatingFilterProxy类解决,实现filter和application.xml交互。
 
  3.1 将filter配置注释
  @Component
  public class HtmlFilter implements Filter{
      //TODO      
  }

 

  3.2 在web.xml 配置DelegatingFilterProxy

  <filter>
        <filter-name>DelegatingFilterProxy</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
            <param-name>targetBeanName</param-name>
            <param-value>htmlFilter</param-value>         
        </init-param>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value><!-- 此参数必需设置-->
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>DelegatingFilterProxy</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

 

   3.3 这样就可以了

 

 

参考资料:

  1.https://www.zhihu.com/question/22977026/answer/23317656

  2.http://www.programgo.com/article/840680429/

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/springlight/p/6297001.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值