Mybatis拦截器的原理

拦截器底层就是aop和责任链模式,那么是aop,就要有代理对象,和invocationHandler,另外拦截器必须得有 标识(拦截哪些对象的哪些方法)

2.责任链模式:事件对象(四大对象),责任链(interceptorChain,里面组织处理器的顺序的用的list实现的),四大对象被创建后,传给责任链,责任链的每个处理器按顺序调用handler(事件对象)方法,针对mybatis是如何实现这个handler方法的,mybatis是里面的interceptor,的plugin方法,其主要目的生成代理对象,因为拦截器后面用的就是动态代理模式,但是这个跟 责任链模式无关。ok,那么处理器的处理条件是什么?就是interceptor的@signature(哪个对象,方法),当四大对象进来interceptor的plugin方法后,判断这个对象的这个方法是否存在,存在那么,给这个对象的(这个接口方法)生成对应的 proxy,如果没有,那么处理器将这个事件对象传给下一个处理器处理

3.拦截器如果不注册,那么mybatis源码中的走interceptorchain,不会处理事件对象,返回的还是原 事件对象

4.当处理器链执行完,返回了对应的proxy,当proxy在执行方法的时候,就会进入invocationHandler的invoke方法,这里就是动态代理,前面处理 事件对象的过程是责任链模式,但是invoke方法不会直接执行具体的动态代理增强,它会 将proxy的内容,封装成一个invocation,传给当前的interceptor的intercept(invocation)方法,在这个方法里面做增强

拦截器的主要2个功能

	1.创建代理对象的方法
	2.具体的执行aop操作的方法(一般拦截器不是InvocationHandler)
	3.具体的InvocationHandler需要配套组件提供

注册拦截器:我们需要做的

	1.注册拦截器
	2.编写拦截器的方法:
		1.生成代理对象的方法 plugin方法
		2.具体执行目标方法的 intercept方法

注册拦截器:不需要我们做的

	1.拦截器链的创建
	2.拦截器链拦截对象执行plugin方法 生成代理对象的 方法调用时机,这个是需要被代理的对象创建后,组件底层源码自动执行的
	3.代理对象有了,我们用proxy执行方法的时候,InvocationHandler的invoke方法不需要我们写
	  一般这个invoke方法起到的作用,就是将proxy传到,拦截器的 intercept方法去执行目标方法 aop

另外,拦截器得有标识,就是说我拦截哪个对象的 具体哪个方法,这个才会只当对应的对象创建的时候,拦截器才会给它创建代理对象,这样它执行具体方法的时候,才会进入 invoke方法里面的 interceptor的intercept方法,不然,所有对象都被拦截器拦截创建代理对象,执行invoke里面的intercept方法,这就会乱套

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值