床长人工智能教程免费文档——PageHelper导致自定
.
声明:本人只是分享一些床长人工智能教程相关的免费pdf文档而已,并非床长人工智能网校的收费文章。尊重版权,支持原创!
背景
最近由于公司要做统一的数据变更记录,以前是基于来做的,这样效率很低,而且在做批量处理操作时基本不可用。
所以我打算使用如,等工具来监听的来做。
但是不是所有的表都会有字段,所以我们须要在上做一些处理,因为公司现在统一用的是,那么现在我觉得比较好的方式就是在上进行拦截改造将从应用层获取到并写入到须要执行的上只对记录。
如有如下
改造的结果就是这样我们就可以记录一次操作改了哪些数据,改数据的人是哪个。
开始干
这里面有几个技术点,且都不怎么复杂,今天我们只聊拦截器。
其实写一个拦截器还是很简单的,网上有很多的代码。
代码写完后,突然发现有些项目的自定义拦截器没有生效。
于是就开始研究了一下,发现是因为我们这些不生效的项目使用了于是找了一些大神的解决方案,和拦截器的顺序有关。
先说一下结论的拦截器采用责任链设计模式,多个拦截器之间的责任链是通过动态代理组织的。
我们一般都会在拦截器中的方法中往往会有语句,其作用是将拦截器责任链向后传递,本质上便是动态代理的。
在方法中执行完后没有执行,意味着这玩意儿没有继续传递责任链可能他有自己的想法。
所以他就没有进入我们自己的拦截器。
注意,敲黑板
不是所有的拦截器都必须要指定先后顺序。
拦截器的调用顺序分为两大种,第一种是拦截的不同对象,例如拦截和拦截就属于不同的拦截对象,这两类的拦截器在整体执行的逻辑上是不同的,在中的方法执行过程中会调用。
所以属于执行过程中的一个子过程。
所以这两种不同类别的插件在配置时,一定是先执行的拦截器,然后才会轮到。
所以这种情况下配置拦截器的顺序就不重要了,在逻辑上就已经控制了先后顺序。
所以如果你一个是类型的拦截器,一个是类型的拦截器,你可以不用管他顺序,也就是说你只须要定义好类型都的拦截器顺序。
类型都为的拦截器顺序问题
如果你的拦截器定义的顺序是这样的你可以通过获取去查看里面的然后看到各个的顺序
他执行的顺序不是先执行,而执行的顺序是。
从这个结构应该就很容易能看出来,将来执行的时候肯定是按照的顺序去执行的。
可能有些人不知道为什么之后会有,这是因为使用代理时,调用完代理方法后,还能继续进行其他处理。
处理结束后,将代理方法的返回值继续往外返回即可。
解决方案因为是类型的拦截器,所以按照前面两条的理论,我们如果想要在拦截器前面执行,就必须要将我们自己的拦截器添加到他的拦截器后面。
那该怎么做呢?
我们可以通过这种方式来做
我们去看的代码是不是发现,该类上面有一个注解,这表明他是在加载完成后,才执行自己的加载。
那么我们是不是可以也可以构建一个类似的代码呢,虽然我们不是一个,但是我们可以通过这种操作来实现我们的须求。
在目录下面,创建一个的文件
里的内容是
这个,就是你自己的配置类的全路径。
该类的代码在后面。
代码
至此,这种方法就了。
但是你可能会执行不成功,该类的方法总是先于的方法执行,这就意味着你的拦截器总是添加到在拦截前面的,那么他总是在拦截器后面执行。
如果出现这种情况,说明你可能在主类上配置了
,且该类会被这个扫描到,这个就是导致的原因所在。
这里面有一个知识点就是,不是配置了就一定表示该类一定在类后面执行。
如果配置类在中配置了且而如果你的类被自己启动类扫描到了,那么该类会被会优先扫描到,配置类对顺序有要求时就会出错。
那么该怎么解决呢?
解决的方法有两个
使用骚操作。
如果你将自己的配置类放到特别的包下,不使用启动类扫描。
完全通过读取配置就可以实现这个目的。
比如,你扫描的包是,那么你就将该配置类放在包下面。
如果你觉得上面这种不习惯,可以用使用
将你的配置类放在包下面就行了。
至此,拦截器的不生效的问题,搞完了。
参考文献
链接
著作权归所有。
商业转载请联系获得授权,非商业转载请注明出处。。。。