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、新建过滤器
第二步:添加拦截器
拦截器有两种方式实现:注解和配置文件,习惯采用配置文件方式
1、添加配置,装配 bean
2、新建拦截器
第三步:添加 AOP 切面
同样采用配置文件的方法
1、配置文件中配置切面、切入点、通知,装配 bean
2、新建切面类
最后写一个 Controller 方法来测试一下:
测试结果:
如有侵权,请联系 service@360linker.com 删除。
以上是关于mybatis的相同拦截器—切面执行的顺序的主要内容,如果未能解决你的问题,请参考以下文章
SpringMVCFilter过滤器AOP切面类Interceptors拦截器各自的执行顺序
SpringBoot使用过滤器拦截器切面及其之间的区别和执行顺序