00:00
好,刚才呢,我们说的是单个插件的,咱们这个拦截原理,那如果我们写上多个插件以后,哎,比如呢,我再来写一个插件my second。Play。那我多个插件,假设呢,我这个插件同样也是实现我们特接口。好,添加未实现的方法,我们把这几个呢来写一下,我在这一块直接让目标方法运行invoc第2PROCEED,好,然后呢,我们在这里边也打印,这是my second。Plug它来拦截我们这个目标方法,它的intercept来这一块呢,Invocation要拦截的目标方法是get门锁好。在这一块呢,我们还是借助我们这个plug这个工具来包装。点哎,包装当前对象,用当前拦截器好包装,咱们在这一块呢也来打印。
01:07
哎,这就是呢,我们这个my second。它来包装我们目标对象,它调用拉方法来包装我们这个目标对象,这是我们要包装的目标对象,好,那么接下来呢,哎,这一块set property我们就也不打印了,好,这个插件签名假设啊,我们跟my first plug一模一样,它也是拦截对象的方法。好,然后我把它也注册在全局配置中,好看好啊,我先注册first,我再注册second。My second my second拉,我们来看一下my second,把它注册进来。诶,注册进来。
02:01
走,如果是两个或者多个插件同时来拦截一个目标对象的情况,我们看一下啊,我来进行debug运行。第八个走,我们刚才呢,给差价的plug我们都打了断点了,好,这时呢,我们进入my first plug行,我先全部放行吧,全部放行啊,全部放行,我们先来看运行效果,我们先来看控制台的打印。好,我装案子走。我们先来看啊,它这一块呢,包装了好久,包装了好久,但是呢,我们真正要包装的对象,我们得看一看,它是谁先进行包装呢?大家看我们是先配置了my first plug,所以说在每一个对象哎,在创建之前来两个插件挨个包装,先用first先配置的先包装,再用后配置的再包装,那么呢,我们来看最后一个,我们最终都是要拦截statement的,所以说呢,我们my first plug先先为我们statement handle了,创建动态代理,My second plug再创建动态代理,关键他这个再创建的动态代理是什么,而执行的时候,它却是先执行我们my second的intercept,后执行my first的intercept,这个流程我们得清楚,我们来看一下啊,我debug出来,我给my second。
03:36
到根我也打一个断点,我们来看他们是怎么包装出来。走。好,进来。无关的对象我们不看,这我们不看,我们直接来到好,来到sta看到哪了好。这个呢,我把my first给放行了,因为my first包装完以后呢,我们这个target我们知道就是这样子,哎,用my first plug,哎包装了我们这个目标对象,这是我们以前的样子,但是呢,大家看好啊,是把my first包装后的结果又传给我们这个第二个插件的plug方法,直接再来包装,所以说呢,相当于为咱们这个。
04:23
本来的动态代理又创建了一层动态代理,好,我如果直接放行,我们来看包装后的结果,你看啊,每一个拦截器挨个包装,它就是按照拦截器的顺序,哎,我们先first进来,它会包装一下my second进来,再包装一下,包装后的整个他给他就是这样子,我们来展开给大家。走,你看啊。走,是这样。诶,为什么是这样呢。哎,展开展开,我们来看展开的样子。
05:00
展开的样子。好,你看啊,我们真正拦截的目标对象是这个statement handler。好,而我们说首先会被my first plug拦截,所以说呢,他先拦截产生一个代理对象,而这个代理对象呢,又交给my second拉来拦截,他一拦截一包装以后呢,又产生一个代理对象,所以说这就是一个层层代理,哎,也就是说如果我们插件一多以后,就会产生一个多层代理。插件啊,多个插件插件就会。产生多层代理,那么这样的话,我们这个代理对象是进来了,那大家说我来执行目标方法怎么办?那肯定啊,执行目标方法的时候,一进来先会进来最大的代理对象,那么就会先执行我们second plug intercept方法,再来执行my first plug的方法,再来执行我们真正目标对象的方法,所以说呢,我们包装的时候,创建动态代理的时候。
06:22
代理的时候是按照配置,按照咱们这个,按照咱们这个插件配置顺序。配置顺序来创建咱们这个代理对象,而且呢是创建的,是创建层层代理对象的,而执行的时候呢,那么执行目标方法的时候时候。啊,那么肯定就是按照反的顺序来的,按照逆序执行的。逆向是不去。
07:00
是去执行的,哎,因为我们最大的代理对象是我们最后一个插件包完以后的结果,所以要执行就是最后一个插件先执行,才能执行它里边的,才能执行它里边的,所以说呢,哎,这就是我们整个插件多插件的运行流程,哎这个流程呢,很很简单,一个简单的图示,这是我们要包装的statement handler对象,而每一个包装就是为它创建一层代理,一层动态代理,所以说呢,这会创建第一层动态代理。好,假设呢,这是创建的第一层动态代理,用我们my first创建的MY。First。Plug,哎,用它创建的,那么呢,我们接下来我们第二层就是用my second,哎,我们因为有多个插件my second再来包装一层。
08:00
好,这个呢,就是我们。Plug。哎,最后一层呢,是他创建的,所以说要执行方法就是这样,哎往进要执行方法,要执行这个中真正的方法,那肯定就得先执行my second的拦截方法,再执行my first拦截方法,再执行目标方法,哎,就是这个流程。大家把这个流程哎掌握住,我们这个插件开发,哎,以后建任何一个插件,我们就能读得懂了。
我来说两句