00:00
好,上一节课呢,我们看了一下这个annoation aware spre autoy,作为我们这个咱们这个aware行,也就是说我们最终总结出结论,因为它是一个这个being post process,它会在任何being创建之前都会尝试来调用post process before方法,那么呢,我们接下来就来看他在调用这个方法的时候都做了些什么活,好我们重新逮bug。这些我们以前啊说过的方法,我就直接放行走走走好来到这个post process before,这个呢们大家都知道,它是呢,我们这个not,这个它是这种后处理,叫being post process,它的作用,它的作用就是在每一个being应每一个咱们这个B创建之前调用调用调用我们这个post process beforeation法,哎这个呢就调到这,调到这以后呢,我们来看它做了些什么事,现在呢,是来创建容器中的第一个鼻啊,因为我们之前看过这是一个循环创建,创建每一个B,那么呢,像这个B跟我们这个切面呢A没什么关系,所是呢这个病的。
01:37
创建我们不关心,主要呢,我们来关心咱们这两个B来,我们之前打的断点,我们math calculator的这个创建,包括呢,我们这个log and space,哎,这个切面的创建,我们关心这两个B创建的时候,哎,我们这个后置处理器都做了什么,好,我就来放行,你看啊,这是第一个being啊,这个什么event method process来,我们就再放行创建第二个being叫什么before event factor,我再来放行,哎,先是before,再是after,好,我第三个宾这个什么a op,哎,先是它的before走,再是它的after,这个be呢,是我们这个配置man con们也不用管。哎,第四个来看,现在这个be呢,叫calcul,就是我们这个数学计算器,好,我们把这个cculator拿来,我们来看它做了什么,先拿到calcul的这个类。
02:37
啊,这个being的名,然后呢,他来判断这个什么target source,这都是一些空集和好,我进来有一个叫advice的beings,啊,什么叫advised being就叫啊,需要增强的,已经增强的这些being,我们来可以看一下,你看啊,每一个being呢,在这有保存false false还是true,你看这都是false,所以呢,我们现在呢,它来判断我们当前的这个cancle letter有没有在advice的宾,哎,它的第一个判断每一个宾创建之前,现在呢,我们来只来关心,在关心,关心谁呢?关心我们这个math calcul,看q letter和咱们这个log aspect的创建,那么我们发现呢,它是第一个,它是来先来。
03:37
判断,哎当前being是否在adviced being中,这个意思呢,就是哎哎,Advice的宾,就是它里边保存了所有哎需要啊增强的鼻,什么叫需要增强的应啊,就是我们哎这些业务逻辑ccul,因为他们里边的这些方法是需要切面来切的,所以说呢,我们要执行它不能像以前那么简单了,需要增强啊,所以说这就是我们需要增强的力,那么我们正好来看一下,现在呢,在这里边是不包含的,只有我们以前的这些配置啊,这些配置因为我们是第一次来处理,那么这个ccul letter我点进来,然后呢,它在这判断是不是基础的这些类型,什么叫基础类型呢?我们可以点进去大概看一看,就是呢,我们是不是以及这个接口,哎,它在这。
04:37
又有一个判断,判断当前宾是否是咱们这个基础类型的,所谓的基础类型就是你是否是实现了这个接口,Advice接口,或者呢是point,我们把这些都复制来,或者呢是这些接口好,这个接口包括呢,这个接口我们现在来判断当前的这个兵是不是基础这个类型的啊,接口下的包括呢,我们还有一个判断啊。
05:13
那第一个呢,我们可以进去,哎,就是我们这个判断,这个判断呢,除过判断你是不是基础类型的,这还有在判断我们是不是切面啊,或者是否是咱们这个切面啊,看到它的这个方法叫啊is aspect,它怎么叫判断是否是前面呢?也可以看一下,哎,这个呢,我给它返回那们进入这个its SP里边继续,哎,然后呢,它用has unpe notation,它是来判断我们有没有这个呃,切面的注解,也就是标了这个unpect的,相当于呢,它判断你这个be是不是切面,你如果是写这个接口的实线也算是前面,如果呢,你是这个,哎,Aspect柱形也算是前面是吧?好,就是呢,他来判断你是不是这个的,那么呢,我们当前的这个mass calculator当然不是了,那就直接哎返回那第一个是false。
06:14
第一个是force,第二个呢,判断should的skip是不是需要跳过,它又来做判断是否需要跳过,所谓的跳过呢,就是他不要再处理这个病,那么这个跳过它是怎么判断的,这个呢,我们可以进去看一看数的skip,你看啊,然后的话呢,它在这执行了一堆业务逻辑,哎,首先第一个叫fund,找到选的这个啊增强我们来拿一下,你看现在呢,有四个增强器,什么叫增强器,就是我们切面里边的这些通知方法,这通知方法就是增强器,我们来看第一个,第一个我们来看,诶就是我们这个log start,下一个,下一个呢,就是我们这个,呃,Log end,再下一个,相当于我们这四个同。
07:14
方法,这就是我们第一步是否需要跳过它是正盘的,它是呢,先来获取啊,后选的的增强器,所谓的增强器就是切面里边的通知方法,只不过呢,他把通知方法的这些详细信息包装成了一个哎称为a whetherr的几合哎增强器的结合,然每一个通知方法它认为是一个增强器,那这个增强器的类型是什么呢?哎,我们来可以看一下啊,每一个咱们这个增强器。它是这个,哎叫隐私音,哎叫这个每一个增强器,每一个封装的通知方法的增强器是这个类型的,是它行,我们就让他来获取这个增强器,他拿到四个增强器,诶拿到四个增强器呢,判断每一个增强器是不是接point cut这个增强器,而我们这个增强器呢,是这个类型的,不是那个SP接,所以说呢,我们就来,哎直接走,如果是的话,就返回处了啊相当于判断增强器判断。
08:28
判断每一个增强器是否是这个类型的,而我们的增强器是这个类型的,所以说呢,啊,我们相当于有别的类型增强器,那么我们就不管它了啊,现在都不是,那就直接放放放放放好,现在呢,Should skip的判断最终又调用负类的should skip,哎,进去它这是一个false,哎,直接就返回false了,走有人呢,现在这一块我们当前处理我们这个mass calcul letter的时候,前面是false,后边也是false,哎,这就false比说好像前面的判断也不咋地用,如果是这个类型的,它会返回一个处,但是呢,这个数的SK,哎,是否需要跳过,永远返回false,那相当于就是要跳过了啊,那么呢,现在我们就来。
09:29
看,跳过那就跳过吧,走好,现在我们这个毕竟的名叫canalcul啊,他拿到还有什么啊,自定义的target source,这跟我们没关系,哎,直接返回now,这个返回now呢,我来走下一步,诶我们看下一步其实来哪了呢?其实就来到我们这个mass calculator的这个方法了,诶你看要调用这个CALCULATOR129行,这个呢,只不过我们只前写了一些注释,把它行号给变了,好,我们把它去掉,重新打上,去掉重新打上,好,我们现在呢,给它打上断点,现在相当于要来创建我们calculator了,我们再下一步,好,当我们把math calcul对象创建完以后,哎,它在这,哎又调用post process after in initialization哎,前面呢,这是北before,接下来是post,哎,我们创建咱们这个对象,创建我们调用刚才的。
10:29
这个方法创建完对象以后呢,它调用after,那after又做了一些什么事,我们来进来看一下,好,这是我们当前的calcul,他来拿到我们这个calcul这个。我们这个病的名字,然后呢,他在这做了一个判断,Early proxy,也就是说之前已经代理过的什么,但是呢,这主要有一个叫wa if necessary,然后呢,在这个后边相当于主要有一个这个东西叫包装,包装包装,如果需要的话,需要的情况下,什么情况是需要包装呢?诶,那我们就来进这个wa方法,我点进去来看,在这个target source,这还是这些空的好,那么这个advice的being已经啊,已经相当于增强过的being里边是不是有我们这个集合,哎,我们,呃,这里边也没有这个什么出false啊,然后呢,它来判断这个判断呢,跟我们之前又是一样了,是不是基础类型的相当,是不是切面这块都是判断是不是切面,哎。
11:48
来又放过,好在这呢,来看它这有一个方法叫create proy if we have advice比说创建一个代理对象,如果说当前being,哎这个being的类型是mass calcul,它来获取当前being的通知方法,以及这些增强器第一步,哎它是怎么挖的,第一步来获取当前B应的所有增强器啊,也就是我们这些通知方法,如果我们这个being应,哎我们可以看一下它怎么获取啊,我们这个呢,是mass calculator,我们点进去图点进去来,它在这呢,就要获取mass calculator这个类型的啊所有增强器,他来找到可用的增强器怎么找呢?磁代稳凝图,哎,这有一个拿到候选的增强器,这个候选的增强器呢,哎,我们以前啊说有这么四个。
12:48
这就是切面里边定义的四个通知方法,然后呢,他来找到这些增强器可用的增强器,他来找到这些增强器可以应用到我们这个class,我们math calcul里边的,我们来写在音,好,我们先把这个注释写在这,它是怎么找呢?来找到能应用能在当前并使用的增强器,也就是说他是来找哪些通知方法,哪些通知方法是需要切入当前并方法的,哎,它就相当于是找这个的,那怎么找呢?我们也可以进去来看一下,它来返回这个当前的这个B,它来找到用a op这个工具来找到所有能用的这个通知方法,点进去,哎,怎么找呢?好。
13:45
这呢先整了一个ible能用的这个增的这个link list,然后呢,它通过下面的这个循环,那这个for循环呢,我们还可以看一下啊,它是两个暗的判断条件,说是不是这种的啊,也就是说便利每一个增强器,这个增强器呢,是不是这种类型的,我们这个增强器呢,啊是这个玩意儿,它还不是这个类型啊,我们就不看了啊,也就说这些它都进不来好,进不来进不来那我们这个就不管了,那用下边,下边呢,还有一个for循环,哎,它又在是在这,在这呢,它判断我们这个增强器是不是这个类型的,哎,但是呢,我们这都已经过了好,然后呢,它这有一个叫can play,是来判断是不是能用,怎么叫能用呢?我们可以can apply进去,其实呢,整个这块的逻辑就开始进入match match用咱们这个point cut,用我们这个切面开始来用咱们这个。
14:46
数点表达式开始来算一下每一个方法能不能匹配,所以说呢,这个大家可以有兴趣过来看,那我们现在是能匹配的,比如说呢,我们第一个增强器啊,就是我们这个log,它肯定是能切入我们这个方法的,包括每一个增强器能不能用,你看只要能用都加入到这个IG在这儿都加进来,都加进来好我们通过这一步走,相当于我们就返回了我们这个能用的增强器。
15:19
哎,我们在这说一下,它是先获取到病应所有病应中所有使用的这个增强器,然后呢,它来判断获取到我们这个能用的增强器,那这些增强器默认是都是能用的,获取到能在当前B应使用的增强器来,就是获取到我们这个可用的啊前面呢是把所有增强器后选增强器,可能有非常多的增强器,这一块呢,是来找到先第一步它是先来找到候选的所有增强器,然后呢再来找到我们能在当前并应使用的增强器,好找到以后怎么办呢?那行找到呢,他还对增强器做了一些排序,因为这个增强器是有顺序的,就说调用哪些通知方法啊,都是有顺序的,第三步我们也可以记录一下给增强器。
16:19
排序,比如说给我们这些通知方法啊,调用的这个增强器的顺序,我们进行一个排列好走这个增强器呢,就算是找到了啊,它不是空,如果是空就返回一个啊,Do not proxy,这个do not pro其实就是,而我们又不是控好直接返回,所以说呢,我们这个object对象里边,它叫specific intercepts,哎,我们这些已经指定好的拦截器,我们这些增强器其实就是要拦截目标方法执行的,比方说呢,他把这个东西,哎,我们就获取来了。
17:01
我们这一块就走完了,获取到所有啊B获取到毕竟所有的增强器,它封装成一个这个object数组,然后呢,我们来主要看它接下来做了什么走,把这些增向器呢拿到,然后呢,啊把我们当前B应哎已已经增强过了,哎,点一个给已增强啊这个缓存里边保存一下,然后呢,保存应保存当前BB在这个中表示呢,我们这个当前B已经被增强处理了啊,然后呢,接下来重要的是在这有一个调用create proxy创建代理对象,接下来第三如果说我们这个病是需要增强的,就会来到这一步,因为我们如果需要增强我们获取到的这些增强器,也就是我们这个通知方法是有的,所以说呢,如果。
18:01
有它就不等于空,不等于空呢,就会进入来下边,下边呢,主要在这有一个叫proxy创建代理对象,如果当前比你需要增强,然后呢,创建当前比你的代理对象,这个代理对象怎么创建呢?来我们大致的进去可以给大家看一看,好我step into走出来再来进去,好出来我进去,然后呢,它是利用这个什么proxy function啊,我们这个代理对象的创建工厂,好我们往下走,主要来到它的核心,那还是先拿到这个啊增强器我们来看,先把这些增强器拿到,然后呢,把这个增强器保存在代理工厂获取。所有增强器,所谓的增强器就是我们的通知方法,然后呢,保存到咱们这个proxy factor中。
19:00
然后呢,我们接下来继续好继续,然后呢,它这还有什么自定义,我们就不看了,主要看这用proxy factory get proxy就说呢,用我们这个代理工厂帮我们创建对象啊,那怎么帮我们创建对象呢?进去走你看这就来创建a op代理走我们来可以看一下创建a op代理怎么创建的,先来得到a op代理的创建工厂好返回,然后呢,创建a op代理为我们这个this对象走我们来看现在呢来创建A代理怎么创建呢?主要有这么几个,一个是创建一个JD代理,一个是啊C,也就说呢们这个C代理相当于我们这会为组件,然后呢,我们创建代理对象,比如说呢,会有两种形式的代理对象,一个是JDK。
20:01
形式的,一个是CG形式的。哎,比如说呢,这是自动决定,它可以自动决定是要创建JDK的自带动态代理,JDK的动态代理,你看这是动态代理还是CG力的,还是CG力的,咱们这个动态代理,那么它怎么自动决定呢?如果说我们这个啊类它是有实现接口的,那JDK能能创建动态代理,那就用JDK,如果我们这个类,比如mass calcul没有实现接口,JDK也没法创动态代理,我们就可以用C,包括呢,我们也可以让他强制使用C,这个呢,我们后来再说啊,比如说呢,我们不管他怎么说,他会在这为我们诶创建一个这个代理对象走走。比如说注意这proxy得到的是一个mass calculator in,就说通过spring c增强了的咱们这个代理对项好,然后呢,我们走返回出去,哎,刚才那个wap我们就相当于调用完了来比,就说这一块呢,Wap的方法相当于最终就会给容器中,给容器中返回当前总件使用CG力保增强了的代理对象,所以说以后我们这个组件要来执行方法,哎,我们来看啊,我们的这个组件LC test在这,如果我们这个mass calculator要来行这个方法,因为我们给容器中放的是这个啊cg Li增强后的代对象,所以要执行这个方法,CG呢,就会帮我们调用那些提前调用我们保存。
21:54
的那些通知,所以说呢,我们说一下以后呢,容器中拿到的以后,容器中以后容器中获取到就是这个组件的代理对象,然后呢,执行目标方法的时候,咱们这个呃,代理对象就会,哎,执行咱们这个通知方法流程就会走咱们这个切面通知方法的流程,因为我们这个通知这些增强器我们之前已经保存了啊,我们执行哪个方法该执行哪些增强器都会执行出来,那么下一节课我们可以看一下这个执行流程。
我来说两句