今天由我给我公司的小伙伴们把公司的拦截器、过滤器、监听器、AOP梳理的以下,然后给大家一起分享了一下用途,然后又从一些问题出发延伸出来然后探讨了一番,收获颇多。夜深人静了,我现在把这些整理一下给可以看到这篇文章的小伙伴分享一下。
1.思想层面
这三个东西的思想都是AOP的思想,面向切面编程。如果不太了解AOP是什么的小伙伴可以去先搞懂这个是什么,AOP 百度百科然后再来看这篇文章。这三种东西都可以通过aop的思想去实现一些 日志记录、权限控制、事务....等一系列的操作。但是这三者有什么不同呢?他们适用于什么场景呢?
2.区别
拦截器 interceptor 和 过滤器 filter 的区别:
过滤器是属于servlet的东西是java web的三大组件之一,它定义在web.xml中,由定义的先后顺序来决定执行的先后顺序。它是基于函数调用的,依赖于servlet,可以对几乎所有请求起作用,只能在初始化时被调用一次。重要的一点是它不能获取spring 中的bean。
拦截器是由spring框架支持的,是基于java反射的,它不依赖于servlet,只对action请求起作用。在它里面可以使用spring中的bean。在一个action请求中,拦截器可以被多次调用,但是过滤器只能调用一次。
附图两张,出自这位小伙伴的文章,讲的挺不错的。
image.png
以上总结的是网上一搜都可以找到的区别。我这里再拿来使用一下,然后接下来我们讲一讲,如何在Filter中使用spring bean对象呢?
刚才在比较区别的时候已经说了Filter不能使用spring中的bean,你这里又交给我们使用这不是打脸么。。。咳咳,这不是哈,原本来说 Filter里确实不支持使用spring bean,但是你可以改造啊。改造之后就可以正确使用了。不信你看~~~
使用这个东东
在你的web.xml中配置上这个东西,然后把你的filter加上@Component,然后就可以在Filter中使用spring 的bean啦~ 是不是感觉好嗨哦?感觉人生已经到达了巅峰?
不过,爱思考的你可能又要问了。这个DelegatingFilterProxy到底是个什么东西呢? 看名字的话应该叫做 委派过滤代理。 代理?你有没有想起来你曾梦想仗剑走天涯。。。咳咳 跑偏了,代理模式记起来没有?没有?那你spring aop 总该知道把,它底层就是设计了代理模式。有两种 一种是jdk 动态代理,另一种是cglib字节码增强。有兴趣的小伙伴可以自行百度一波,这里就不展开赘述了。
然后让我们点开这个神奇的类,然后一探究竟。
这个类中所有的方法和变量 我们看到这里面有个initFilterBean()的方法,一看名字就知道是初始化的,然后点进来看一下 方法具体实现
initFilterBean()该方法主要完成两个功能:
1、找到被代理类在spring中配置的id并赋值给targetBeanName。
2、使用找到的id从spring容器中找到具体被代理的类,并赋值给delegate
initDelegate()该方法的作用是,从spring容器中获取到具体被代理的filter
我们知道一个过滤器的主要实现在doFilter()方法中,我们来看以下这个类中的doFilter方法的实现。
方法具体实现
该方法主要是使用被代理的filter,并调用invokeDelegate方法。
然后invokeDelegate方法中主要是调用被代理的filter中实现的doFilter方法。看到这里应该大家也看明白了,可能我的知识还没有那么丰富和深厚,不过我觉得大家应该可以看得懂这个实现的过程。这篇文章应该让你对过滤器和拦截器有一点认识和了解了。
网友评论