昨天看了会spring web中部分代码,主要是各种filter,回顾一下:

Spring的web包中中有很多过滤器,这些过滤器位于org.springframework.web.filter并且理所当然地实现了javax.servlet.Filter,不过实现的方式有以下几类:

(1) 直接实现Filter,这一类过滤器只有CompositeFilter;

(2) 继承抽象类GenericFilterBean,该类实现了javax.servlet.Filter,这一类的过滤器只有一个,即DelegatingFilterProxy;

(3) 继承抽象类OncePerRequestFilter,该类为GenericFilterBean的直接子类,这一类过滤器包括CharacterEncodingFilter、HiddenHttpMethodFilter、HttpPutFormContentFilter、RequestContextFilter和ShallowEtagHeaderFilter;

(4) 继承抽象类AbstractRequestLoggingFilter,该类为OncePerRequestFilter的直接子类,这一类过滤器包括CommonsRequestLoggingFilter、Log4jNestedDiagnosticContextFilter和ServletContextRequestLoggingFilter。

本文要讲述的,即是GenericFilterBean、OncePerRequestFilter和AbstractRequestLoggingFilter。

GenericFilterBean

抽象类GenericFilterBean实现了javax.servlet.Filter、org.springframework.beans.factory.BeanNameAware、org.springframework.context.EnvironmentAware、org.springframework.web.context.ServletContextAware、org.springframework.beans.factory.InitializingBean和org.springframework.beans.factory.DisposableBean五个接口,作用如下:

(1) Filter,实现过滤器;

(2) BeanNameAware,实现该接口的setBeanName方法,便于Bean管理器生成Bean;

(3) EnvironmentAware,实现该接口的setEnvironment方法,指明该Bean运行的环境;

(4) ServletContextAware,实现该接口的setServletContextAware方法,指明上下文;

(5) InitializingBean,实现该接口的afterPropertiesSet方法,指明设置属性生的操作;

(6) DisposableBean,实现该接口的destroy方法,用于回收资源。

GenericFilterBean的工作流程是:init-doFilter-destory,其中的init和destory在该类中实现,doFilter在具体实现类中实现。

GenericFilterBean中包含一个内部私有类FilterConfigPropertyValues,主要用于将web.xml中定义的init-param的值取出。

OncePerRequestFilter

抽象类oncePerRequestFilter继承自GenericFilterBean,它保留了GenericFilterBean中的所有方法并对之进行了扩展,在oncePerRequestFilter中的主要方法是doFilter。

AbstractRequestLoggingFilter

AbstractRequestLoggingFilter继承了OncePerRequestFilter并实现了其doFilterInternal方法

我们在使用过滤器时,通常没必要知道GenericFilterBean、OncePerRequestFilter和AbstractRequestLoggingFilter,但不防碍我们了解这几个类,就上文所述,
AbstractRequestLoggingFilter继承自OncePerRequestFilter,
OncePerRequestFilter继承自GenericFilterBean,
所以我们知道,genericFilterBean是任何类型的过滤器的一个比较方便的超类,
这个类主要实现的就是从web.xml文件中取得init-param中设定的值,然后对Filter进行初始化(当然,其子类可以覆盖init方法)。

OncePerRequestFilter继承自GenericFilterBean,那么它自然知道怎么去获取配置文件中的属性及其值,所以其重点不在于取值,而在于确保在接收到一个request后,每个filter只执行一次,它的子类只需要关注Filter的具体实现即doFilterInternal。

AbstractRequestLoggingFilter是对OncePerRequestFilter的扩展,它除了遗传了其父类及祖先类的所有功能外,还在doFilterInternal中决定了在过滤之前和之后执行的事件,它的子类关注的是beforeRequest和afterRequest。

总体来说,这三个类分别执行了Filter的某部分功能,当然,具体如何执行由它们的子类规定,若你需要实现自己的过滤器,也可以根据上文所述继承你所需要的类。

另外Spring代码中有不少抽象工具类,内部只有静态方法,为避免别人误用它来生成实例,将它设计为抽象类,这是设计者的意图。

最新文章

  1. SQL Server 服务器磁盘测试之SQLIO篇(一)
  2. css sprite
  3. 有关GPU硬件的理解
  4. DOM解析原理
  5. Jasper_sheetName_defined by parameter or hard coding or filed name
  6. pcduino通过USB方式刷机
  7. iOS 设置状态栏的颜色
  8. lambda 3
  9. Android学习笔记(二)Git和Github
  10. B. Karen and Coffee
  11. jquery.validata.js 插件
  12. Generator和Coroutine学习
  13. 安装完Ubuntu后要做的事情
  14. 华为设备默认console密码
  15. VUE 全局变量的几种实现方式
  16. Mysql 调优2个语句
  17. LJ 5月6日A组考试考试题解
  18. memcached哈希表操作主要逻辑笔记
  19. mysql 源代码编绎
  20. canvas二三事之签名板与视频绘制

热门文章

  1. 梦想CAD控件com接口扩展数据
  2. 梦想CAD控件安卓界面控制
  3. Redis系列(四)--持久化
  4. CPU 的寻址方式
  5. __cdecl、__stdcall、__fastcall 与 __pascal 浅析
  6. Django ContentType内置组件
  7. notepad++使用NppFTP连接linux,编写shell脚本无法保存上传的问题
  8. MAC上postman离线安装时提示加载扩展程序出错怎么办?
  9. outflow Boundary Condition in FLuent
  10. Java基础学习总结(84)——Java面向对象六大原则和设计模式