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方法,这就会乱套

你可能感兴趣的:(代理模式,java,开发语言)