mybatis的相同拦截器—切面执行的顺序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis的相同拦截器—切面执行的顺序相关的知识,希望对你有一定的参考价值。

参考技术A

结论:拦截同一个方法的拦截器和我们在mybatis-config.xml文件中的顺序相反,而Spring容器配置的plugin最后执行方法。

mybatis自定义拦截器(一)基本使用
mybatis自定义拦截器(二)对象详解
SpringBoot整合Mybatis自定义拦截器不起作用解决方案!!!

推荐阅读——plugin生效的方式

源码位置:mybatis的自动加载: org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration#sqlSessionFactory

注意: SqlSessionFactoryBean 实现了 InitializingBean 接口,在 afterPropertiesSet() 方法中将执行 org.mybatis.spring.SqlSessionFactoryBean#buildSqlSessionFactory 方法去读取ConfigLocation的xml文件,解析plugin并放入集合中。

源码位置: org.apache.ibatis.plugin.InterceptorChain 该方法会对target代理,并且对代理类在进行代理。一层一层的增强target类,故越靠后的Interceptor越先执行。

而plugin方法:

实际上会调用 Plugin.wrap(target, this) 方法。

wrap方法会创建代理对象。

wrapper() 方法对target对象一层一层的代理。即before切面执行的顺序与放入plugins的顺序相反。

mybatis多个plugins的执行顺序

过滤器拦截器AOP切面执行顺序的比较




过滤器:基于 Servlet,通过函数回调方式实现,可以过滤请求和图片文件等,每个请求一个过滤器只能过滤一次。

拦截器:基于 java 的反射机制,代理模式实现,只能拦截请求,可以访问上下文等对象,功能强大,一个请求可多次拦截。

拦截器是 Spring 中AOP的一种实现方法。另一种方法通过 Pointcut、Advice实现


下面具体测试三者执行顺序:

第一步:添加过滤器

  2、新建过滤器

过滤器、拦截器、AOP切面执行顺序的比较


第二步:添加拦截器

拦截器有两种方式实现:注解和配置文件,习惯采用配置文件方式

  1、添加配置,装配 bean

过滤器、拦截器、AOP切面执行顺序的比较

  2、新建拦截器

过滤器、拦截器、AOP切面执行顺序的比较


第三步:添加 AOP 切面

同样采用配置文件的方法

  1、配置文件中配置切面、切入点、通知,装配 bean


过滤器、拦截器、AOP切面执行顺序的比较

  2、新建切面类

过滤器、拦截器、AOP切面执行顺序的比较

最后写一个 Controller 方法来测试一下:

过滤器、拦截器、AOP切面执行顺序的比较

测试结果:



如有侵权,请联系 service@360linker.com 删除。

以上是关于mybatis的相同拦截器—切面执行的顺序的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVCFilter过滤器AOP切面类Interceptors拦截器各自的执行顺序

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

spring中过滤器(filter)、拦截器(interceptor)和切面(aop)的执行顺序

MyBatis拦截器的执行顺序引发的MyBatis源码分析

mybatis(3)—自定义拦截器(上)基础使用

springboot+mybatis+dubbo+aop日志第三篇