精选文章 SpringBoot 使用过滤器、拦截器、切面(AOP),及其之间的区别和执行顺序

SpringBoot 使用过滤器、拦截器、切面(AOP),及其之间的区别和执行顺序

作者:Sun@786.com 时间: 2020-08-05 05:25:34
Sun@786.com 2020-08-05 05:25:34

先上代码,下面的demo中包含多个拦截器、过滤器,以及切面的前置通知/后置通知/环绕通知:

https://gitee.com/xiaorenwu_dashije/filter_interceptor.git

SpringBoot 使用过滤器、拦截器、切面(AOP),及其之间的区别和执行顺序1

下面总结一下相关原理:

首先了解一下SpringMVC的执行流程

SpringBoot 使用过滤器、拦截器、切面(AOP),及其之间的区别和执行顺序2

 具体流程如下

  1. 用户发起请求到前端控制器(Controller)
  2. 前端控制器没有处理业务逻辑的能力,需要找到具体的模型对象处理(Handler),到处理器映射器(HandlerMapping)中查找Handler对象(Model)。
  3. HandlerMapping返回执行链,包含了2部分内容: ① Handler对象、② 拦截器数组
  4. 前端处理器通过处理器适配器包装后执行Handler对象。
  5. 处理业务逻辑。
  6. Handler处理完业务逻辑,返回ModelAndView对象,其中view是视图名称,不是真正的视图对象。
  7. 将ModelAndView返回给前端控制器。
  8. 视图解析器(ViewResolver)返回真正的视图对象(View)。
  9. (此时前端控制器中既有视图又有Model对象数据)前端控制器根据模型数据和视图对象,进行视图渲染。
  10. 返回渲染后的视图(html/json/xml)返回。
  11. 给用户产生响应。

核心就是DispatcherServlet核心控制器,我们看源码可知道DispatcherServlet是Servlet的子类

SpringBoot 使用过滤器、拦截器、切面(AOP),及其之间的区别和执行顺序3

下面用一张图说一下过滤器、Servlet容器、拦截器、AOP、Controller之间的关系

SpringBoot 使用过滤器、拦截器、切面(AOP),及其之间的区别和执行顺序4

 

 然后具体执行流程如下:

SpringBoot 使用过滤器、拦截器、切面(AOP),及其之间的区别和执行顺序5

拦截器和过滤器的区别

1、拦截器不依赖与servlet容器是SpringMVC自带的,过滤器依赖于Servlet容器。

 

2、拦截器是基于java的反射机制的,而过滤器是基于函数回调。

 

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

 

4、拦截器可以访问controller上下文、值栈里的对象,而过滤器不能访问。

(拦截器的preHandle方法在进入controller前执行,而拦截器的postHandle方法在执行完controller业务流程后,在视图解析器解析ModelAndView之前执行,可以操控Controller的ModelAndView内容。而afterCompletion是在视图解析器解析渲染ModelAndView完成之后执行的)

( 过滤器是在服务器启动时就会创建的,只会创建一个实例,常驻内存,也就是说服务器一启动就会执行Filter的init(FilterConfig config)方法.当Filter被移除或服务器正常关闭时,会执行destroy方法)

 

5、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

(关于这句话的解读是:我们知道拦截器是SprinMVC自带的,而SpringMVC存在Controller层的,而controller层可以访问到service层,service层是不能访问service层的,而过滤器是客户端和服务端之间请求与响应的过滤)

 

6、过滤器和拦截器触发时机、时间、地方不一样

(过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是在servlet处理完后,返回给前端之前,如果看不懂可以看7完后再来理解)

 

7、过滤器包裹住servlet,servlet包裹住拦截器。

 

####转载自:https://www.cnblogs.com/java-spring/p/12742984.html 内容不错 直接拿下来了 如有问题请指教!

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:单个数组切割成二维数组

下一篇:Webview.apk —— Google 官方的私有插件化方案

您可能感兴趣

  • Spring Boot 拦截器与过滤器 例子

    一、拦截器与过滤器   在讲Spring boot之前,我们先了解一下过滤器和拦截器。这两者在功能方面很类似,但是在具体技术实现方面,差距还是比较大的。在分析两者的区别之前,我们先理解一下AOP的概念,AOP不是一种具体的技术,而是一种编程思想。在面向对象编程的过程中,我们很容易通过继承、多态来解决纵向扩展。 但是对于横向的功能,比如,在所有的service方法中开启事务,或者统一记录日志等...

  • 你还在从零搭建项目 ?

    关注“Java后端技术全栈” 回复“面试”获取最新资料 回复“加群”邀您进技术交流群 作者 | 无知者云 链接 | https://www.cnblogs.com/davenkin 前言 在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地...

  • spring学习笔记(六)——AOP part3

    慕课网,spring入门,第6章Spring AOP的API介绍 NameMatchMethodPointcut接口,比如下图mappedNames属性,会匹配sa开头的方法名 BeforeAdvice接口 ThrowsAdvice接口 afterThrowing方法中,Exception参数是必有的,其他参数可以没有。 AfterReturningAdvice接口 around advic...

  • MySQL 精华总结(收藏版)

    一、MySQL架构 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。 连接层:最上层是一些客户端和连接服务。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通...

  • 脚本文档_创建完美的架构文档脚本

    脚本文档 描述 (Description) System views allow us to gain access to information about any objects within SQL Server, from tables to extended properties to check constraints. This information can be colle...

  • Spring5春天还是配置地狱

    # Spring笔记 ## 1、概述及IOC理论推导 #### 1.1 Spring简介 Spring : 春天 --->给软件行业带来了春天 2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。 2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。 很难想象Rod Johnson的学历 , 他是...

  • 阿里面试最全面经总结

    1.听说你对JVM有点研究,讲一讲JVM的内存模型吧(我说虚拟机栈,本地方法栈,程序计数器,堆,方法区) 总的有什么,生命周期,每一个 JVM 的分区 ,线程私有,线程共享,直接内存 线程私有的生命周期和线程相同,线程共享的和虚拟机的生命周期相同。 java虚拟机栈是将方法的变量,出入口参数等以栈帧的形式存入,虚拟机中只有一个堆,堆中存入的是new出的对象,而且堆是垃圾回收的主要场所。方法区...

  • 135张图带你 MySQL 入门

    SQL 基础使用 MySQL 是一种关系型数据库,说到关系,那么就离不开表与表之间的关系,而最能体现这种关系的其实就是我们接下来需要介绍的主角 SQL,SQL 的全称是 Structure Query Language ,结构化的查询语言,它是一种针对表关联关系所设计的一门语言,也就是说,学好 MySQL,SQL 是基础和重中之重。SQL 不只是 MySQL 中特有的一门语言,大多数关系型数...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。