![db404f036fa32b7e8b6160c4b86654fc.png](https://i-blog.csdnimg.cn/blog_migrate/63e07c9d29fb822e7fd0f2669aaddc19.jpeg)
Interceptor
Interceptor拦截器,可以拦截ParameterHandler,ResultHandler,StatementHandler,Executor的执行,这个接口定义了2个默认的方法,plugin和setProperties。plugin是获取代理类,setProperties是设置拦截器额外配置的属性。主要的就是intercept方法,这个方法是拦截后执行的方法。如果要实现自己的拦截器需要实现这个接口,并实现intercept方法。参数Invocation是封装的方法调用的信息。
![835b8c08f9ff716b851ac811b09b9804.png](https://i-blog.csdnimg.cn/blog_migrate/5d39165b98560a222133ff0f5ae95c74.jpeg)
Interceptor接口
再看下Invocation类,有3个变量,一个是目标对象target,一个方法method,再就是参数args。proceed方法通过反射方法调用目标方法。
![ce18f32630159113fe13a93f6102aac7.png](https://i-blog.csdnimg.cn/blog_migrate/61ef10a19b635cbeb86bb419eb663d89.jpeg)
Invocation
上文说过Plugin实现了InvocationHandler接口,现在就看看Plugin的invoke方法,这个方法如果是需要拦截的方法会调用intercepter的intercept方法,此时生成了一个Invocation实例。如果不是拦截的方法,就通过反射调用原来的方法。
![85593c5949ec4cda70577068abe8fa44.png](https://i-blog.csdnimg.cn/blog_migrate/005438b92e6bc47eebb4c60b7a81176a.jpeg)
invoke方法
哪些类和方法是需要拦截的呢?
那就需要看两个注解,是Intercepts和Signature。这个两个方法配合使用才能产生效果,先看下注解Intercepts,这个注解需要有个Signature数组。
![a1beb6413292c210648d5c7c5c5fec8a.png](https://i-blog.csdnimg.cn/blog_migrate/a22b864a3074e6b40e1fd6869fff3787.jpeg)
Intercepts注解
看看Signature需要三个值,一个是Class对象,一个方法名称,最后一个就是方法需要的参数类型。
![57dd7820abca6746942bf01819838dd7.png](https://i-blog.csdnimg.cn/blog_migrate/9dfdcd2ac004cfb14991640b7e4debe4.jpeg)
Signature注解
获取哪些类型和方法需要拦截?首先获取拦截器的注解Intercepts,再获取Intercepts的Signature,从而获取需要拦截的发方法和参数。
![9520661bdbd0e85ed4585b4e85e81725.png](https://i-blog.csdnimg.cn/blog_migrate/05ee3e52864d4538ad88483087613f65.jpeg)
获取哪些类型和方法需要拦截
一个简单的例子,拦截Executor类,并且拦截Executor中的query方法
![2646dcdbc77273d926bfc2281e8b0641.png](https://i-blog.csdnimg.cn/blog_migrate/acef2a5c6d4c7c0063f0b2dbe587f106.jpeg)
一个简单的例子