00:00
好,上一节课呢,我们研究了一下notation aware SP接auto proxy这个组件,它是一个后置处理器,也就是我们这个a aspect接auto proxy注解想给容器中导到这个组件,我们发现呢,它在我们这个B创建前后会做一些事情,特别是对象创建之后,他呢会判断这个对象是否需要包装,也就是说如果我们这个业务逻辑组件需要被切入,也就说它是一个需要增强的组件,它就会呢为这个组件创建代理对象,然后呢,容器中拿到的这个组件就是我们一个代理对象,那么这执行方法就是代理对象在执行方法,那接下来呢,就来研究一下这个方法的执行流程,哎,它是怎么一执行,然后先来执行前置通知,再是目标方法,再是后置通知,再是返回或者我们异常通知,它是怎么。
01:00
有序的来执行这些流程的,好,我们来说一下,哎,目标对象目标方法的执行,那么呢,我们接下来就给这个目标方法,这我打一个断点,然后呢,我来重新给八个进来。好,前面的这些方法呢,我就直接放过啊,我们以前看过的方法呢,就直接放过来到我们这个要执行的目标方法。好,来到我们这个除法,我们呢就可以step into进去来看流程,那么into之前呢,我们看一下这个CC,诶,这确定是C增强后的对象,它里边呢,还装了好多的这个数据,比如这个CALL01,哎,这是我们这个proxy factor,我们上一节课看过的,它里边呢有咱们这个五个增强器,哎,这个这是默认方的,还有这四个增强器,就是我们这个四个通知方法,比如我们来举一个例子,第一个通知方法它是一个after throwing advice,哎,这如我们这个after throwing advice的声明是哪个方法,包括呢?我们这个方法名,包括方法用的参数等等信息,比如说呢,相当于我们容器中放的这个增强后的代理对象,里边保存了我们这个啊通知方法的这个信息,包括呢?哎,这是要切入哪个目标对象的,这些信息都有容中保存。
02:29
保存那组件的代理对象,也就是说我们,也就是我们说增强后的对象,CG增强后的,然后呢,这个对象里边保存了咱们这个详细信息,哪些详细呢信息呢,比如咱们这个增强器,比如我们所有的增强器来比如我们这个目标对象。
03:00
等等等等,好,我们接下来呢,就来执行它的这个除法,我来step into进来,好,这呢是牵扯到JDK的这些类加载机制相关的,我们就直接返回出去,返回出去,现在呢,没什么源码了,我先step into进来出去,再进来,再出去,再进来,哎这么两三次以后呢,就来到咱们这个cg a proy的方法,哎,我们来说一下,那么呢,我们首先给大家来到这叫cg Li a op procy的inter方法,哎,这个方法呢,按照名字听起来,这就是拦截,这就是来拦截目标方法的执行,你看我们这是想要执行目标方法的,但是先呢,让这个a op代理先来拦截一下,我们就来看他的拦截逻辑,拦截目标方法的执行。
04:00
拦截,那么它的拦截逻辑是怎么样的呢?我们就来看一看,好进来。我们先来看整个流程的大体逻辑,哎,大体逻辑它在这呢,我们来往下走,这都是声明一些变量,好哎,在这呢,也都是一些变量,声明target就是我们要切的目标对象mass calculator没问题,主要呢,这有一个有一个东西叫Che,就是量的意思,然后呢,它是先来get intercept啊,并且呢,获取intercept以及这个intercept的这个量,所以说呢,我来说第一步它是要获我们这个拦截量,通过它这个方法,我们翻译出来它的意思是想要获取拦截器垫,而这个advice就是我们这个proxy factor,哎,根据proxy factor,根据据咱们proxy factory对象对象来我们这个获取拦截气垫,那么这个。
05:11
拦截气量的获取,我先把这个方法我们来复制在这获取谁的拦截气量呢?获取我们这个目标方法的拦截器垫,获取目标方法将要执行的。目标方法,哎,所以说呢,这个method,这就是我们将要执行的这个除法的拦截器量,这个量呢,我们得仔细来进来看,但是呢,我们把整个大体流程看清楚,第一个是获取量,获取完链以后,如果这个链是空的,也就说呢,没有拦截器链,它就直接什么muscle proxy work,它是做什么呢?来我们就可以来看一下这个注释,它的意思是说,哎,他们将会跳过这个创建一个man的invoc,然后呢,Just in work,直接就来直哎,直接来执行目标对象的目标方法,所以说呢,啊,我们这个先来获取拦截器链,如果有拦截器量。
06:18
如果没有拦截气链起链,那么呢,我们看到的这个注释,它意思是直接执行目标方法,那么如果有拦截气垫呢?那第四步如果如果有拦截器量,那么怎么做呢?我们来看一下它是怎么做,如果有拦截气量,然后呢,它创建一个cg Li methodvoc啊,创建一个这个VOC对象,然后调用它的pro方法,把拦截气垫啊,目标对象,目标方法这些参数等等都传过去,比说呢,如果有拦截气垫,把需要执行的目标,目标对象,目标方法,包括拦截器。
07:17
链等所有信息拦截器链等信息,哎,传入创建一个我们叫cg method的并调用创建一个这个对象并。并调用啊我们这个mi我就简写速的,我开的什么方法呢?啊,这个方法我们可以看一下,并调用这个proceed方法,然后呢,哎,调用这个proceed方法,Proceed方法呢,会有一个返回值,这个呢相当于它来调用这个方法,它叫return value,然后呢它来处理这个返回值,好所以呢,核心就来到了我们这个拦截器链到底该怎么获取,它是来做什么的,听起来它是来拦截目标方法前后进行执行的,而在目标方法前后要执行,我们其实是要执行通知方法的,所以说呢,我们大胆猜测这个拦截气量,那么就是应该是来,哎,来说咱们这个通知方法到底怎么执行,再来怎么执行目标方法等等的。好,我们就来主。
08:37
要研究这个拦截气垫,如果有拦截气垫,这个拦截气垫是怎么获取的。哎,我们在这儿来研究,那么呢,我来进入这个拦截气量的这个获取流程,哎,他用这个proxy function就来获取当前方法,哎,获取我们目标方法的拦截器量,我来step into进来,进来以后呢,他把这个当前方法,这都是一些缓存,缓存就是要把这些获取到的东西保存起来,方便下一次直接用好这个缓存,我们直接过去,我们用这个,他用这个ad adviser Cha factory,用这个ad adviser链的工厂来来获取我们这个目标方法的这个拦截气量,啊,就是它如果获取到了,就把这个看的返回,怎么获取呢?我大土进来。
09:26
我们看到呢,它这呢会先来创建一个这个list,而这个list来家注意,呃,它这创建在后边呢,各种遍历在这儿赋值,然后一直在后边会返回,所以呢,整个拦截器的量就会被封装在list中,哎,我们可以来说一下,先来创建一个这个list,保存所有拦截器,而这个拦截器呢,它这个注意啊,List创建的时候,这个还已经符合了,这个长度有多长呢?就是我们这个con get adviser跟我们这个adviser的长度,Advise是什么?Con是我们这个proxy function,而所有的adviser就是我们这个增强器,哎,会有五个,一个呢是我们默认的,剩下这四个都是我们这些通知方法,哎,比如第一个通知方法after throwing的,哎,相当于这些通知方法封装后的这些结果,所以说呢,它的长度是五。
10:26
五是怎么来的,一个默认的,一个默认给我们里面填的,我们来可以看一下啊,有一个默认的叫exp intercept和四个和四个增强器,哎,这四个增强器呢啊,它们合起来就有五个,那么接下来我们来看它是怎么做的。这例子呢,虽然有长度,但是现在是空的,好我们来往下走,往下走呢,大家注意,这是有一个for循环,它是拿到所有的adviser,也就说这五个,他来遍利每一个adviser,怎么办呢?他判断如果是切入点的这些增强器,也就说是需要切面切入的这些增强器,然后的话呢,他在这里边,哎,把这个增强器传过来,会包装一个这个intercept,把这个intercept放这,那如果不是,如果是这种,它也是在这,相当于把这个传进来整cept,然后放进来,或者呢,直接传进来,然后整一个特S放进来,所以说也就是一句话,它会遍利所有的增强器,为这些增强器呢,啊,把这些增强器封装成一个叫intercept。
11:46
它来便利所有的增强器将其转为这个intercept,这个呢,我们是看到了这一块的逻辑,也就是说主要都是调这个这句话。
12:07
主要都是这一句话,Gcept,那我们呢,可以在这个cept里边看一为什么需要第我们来看啊,第个是看判断是不是我们来下来,诶它是这个point cut advise,然后呢来继续给他放行进到这,主要呢,他在这会拿到这个inter,诶也就说把这个我们来可以看一下是cept拿到这个cept也是cept,它是怎么拿的呢?刚才我们给放过了,我们可以点进去,其实呢,就很简单,他在在这呢判断一下,如果我们这个adviser是的,那就直接加进这个集合里边,如果不是啊它它这呢,还有会有一些适配器来把这个做一些转换。
13:07
再加进来,所以说呢,咱们这相当于有两个判断判断啊,然后呢,这块呢,就相当于将咱们这个增强器先转为转为什么呢?转为我们要用的,诶我们点错了,转为我们要用的这个啊method intercept。那它是怎么转呢?哎,它就是呢,在这非常简单的判断,如果是这种,那就直接整过来,如果不是,他还需要这些advise的适配器啊,帮他转过来,转过来以后呢,你有一个的intercept就行了,如果是,如果是man intercept,那就直接加进去,我们来点进来啊,如果是man的intercept,直接啊返回,直接加入到集合中,如果不是,它怎么做呢?如果不是来看啊,这是如果是是的,它变过来放这里边,如果不是,它这有一个循环,这虽然没有else逻辑啊,但是实际上我们一会儿走,大家会看到,如果不是的情况下呢,它用一些advice,如果是使用这些增强器的适配器,将咱们这个。
14:33
增强器转为。要说呢,严格来说还是转为这个intercept啊,反正都要给你转成这个cept,我们为这个方法拦截器转完以后呢,把这个man的intercept的数组返回,哎,返回转换完成,返回man的intercept数,我们呢,可以为这个过程打个断点看一下,好,我们把这个只要是get intercept我都打成断点,我来一个一个放行放行好,现在呢,我们来看第二个adviser,这个R呢,它是一个aftering啊,我们这个aftering advice aftering通知方法,它怎么转呢?我们可以过来看他先判断这个advice after throwing advice是不是muscle intercept。
15:30
我们可以来看一下CTRLC。点进去,哎,它是的cept,所以说呢,他会在这判每一个是不是,如果是直接加进去好,然后呢,他利用这些adapt这些适配器,诶有三个适配器,一个叫before before适配器,一个叫after returning适配器和through这个试配器,我们来看会有用吗?哎,没不用,这个也不用好,然后呢,我们给它返回,这相当于第一个处理完,然后第二个我们第二个呢,是咱们这个,我们来看是哪个,前面呢是aspi接after returning advice相当于after returning后置通知包装的这个,那他的判断。
16:19
哎,它不是的intercept,也就说有些通知方法它是实现了的intercept接口有些不是不是怎么办呢?接下来用这个adapt,我们来看第一个是before advice专门来转前置通知的,看是不是能支持我们这个after returning返回通知,但是这个肯定不支持,但是我们来用第二个after,诶这是after returning的,他肯定支持,支持的话呢,他用这个adapter帮我们转,怎么转呢?进去可以看一下,诶实际上就是把这个advice拿过来给他包装一个intercept而已,也就说OK,比就说你如果是一个man的intercept,那就直接放,不是我给你包装过来,那整个流程第三个啊,第三个是咱们这个after advice后置通知,后置通知,哎,它直接是也就OK了,那么第四个我就直接放行到第四个,哎,第四个呢,它是。
17:20
我们这个要封装谁备,哎,我们这个前置通知,哎前置通知呢,不是不是他用这个来转换,所以说呢,哎整个转换我们让它走完。好,全部做完,做完以后呢,我们整个for循环便利把每一个增强器转为咱们这个man的intercept,相当于方法拦截器我们就做完了,做完了以后呢,好,我们整个cept list返回,我们可以看到list里边呢,就有五个相当于是拦截器,这两个呢,人家本来就是拦截器,而before advice跟after returning是哎用那个adapt重新转了以后的这个拦截器,反正都转成了的intercept拦截器,好大家可以看,把这个拦截器我们转完以后走这个量就出来了,相当于我们这是把所有的都转成这个拦截器,拦截器完了以后,我们这个方法的这个拦截气垫就出来了,拦截气垫里边其实就是每一个通知方法,什么叫拦截气垫拦截。
18:30
气拦截气量,所谓的拦截气量其实就是每一个通知方法,每一个通知方法又被又被包装为拦截器,包装为方法拦截器,然后呢,后来我们这个方法的执行都是利用咱们这个man的intercept方法拦截器机制,然后呢,我们先让它执行,再让它执行好,整个呢,咱们这个拦截气垫我们就出来了,那我们接下来往下走,而我们这个new cg力B这个影慢的影卧开来拗这个method invoc对象,好,我们让它拗出来,拗出来以后呢,接下来就是proceed来执行我们这个拦截垫,那么我们来看啊,整个拦截垫,也就说呢,我们new的这个C会把拦截垫传过来,过来以后呢,这。
19:31
执,而整个执行其实就是来触发拦截气垫的调用过程,来我们下一节课呢,来研究一下拦截气垫,拦截气垫到咱们这个触发啊过程。
我来说两句