00:00
来,那么接下来呢,我们就在我们的切面中啊,主要去写我们的这个通知了啊呃,那么像这个通知的话,大家注意了啊呃,Point就是这个Spark键,它支持我们五种类型的这个通知啊,就是这个地方啊,12345怎么是六了,这是五哈啊总共有什么五个这个通知,大家分别来看一下,前置通知,后置通知,返回异常以及环绕通知,那么每个通知呢,其实就是一个什么横切关注点了,理解这个意思吧,每个通知就是一个横切关注点啊好,那么这个通知应该怎么写呢?啊,通知应该怎么写啊,注意啊,我们可以先来看这个地方通知,那么每个通知呢,它都有一个具体的作用啊,你看看哈,呃,通知就是什么呀,在具体的连接点上要执行的操作,我们再来把这个给大家去想一下,连接点是谁来着,就是目标对象的方法。
01:00
啊,OK,你要在这个方法上面去作用什么工作,比如说我想在这个方法上面去记录一下日志,那么这个日志怎么记录呢?你就通过这个通知来去做啊,一个界面呢,可以包含一个或者是多个通知,对吧?刚刚我们说过是总共有五个呀,其实不只有五个啊,不仅仅有五个,还有别的通知呢,而我们要了解的这五个就足够用了啊,听懂了吧?OK,然后还有一个什么呀啊,通知所使用的注解的值呢,往往是切用点表达式啊,这个是我们一会儿要去给大家去说到的,现在的话呢,你先知道一下就行了,那么接下来我们就结合上一个前置通知呢,来我们去写一下这个通知,顺带着呢,我们就会引出我们的切入点表达式等等等等一些东西,行吧,来,我们就回到我们的开发工具中,我们先来去写一个前置通知,首先给大家解释什么叫做前置通知啊,就是在目标方法哎。
02:00
执行之前执行的啥叫做目标方法呀,就是你目标对象的那个方法,就是我们最原本的那个加减乘除,能理解能理解什么意思吧,OK好吧,那现在我们这个目标方法还不存在啊,所以说你看了哈,我做这样的事,我把我们昨天写过的这个,一个是接口,一个是实现类,看到没有CTRLC啊,我把这两个呢拷贝过来。大家来看一下是不是一个是接口啊,再有一个就是我们的实权类吧,那你看这个实权类里面就是很干净的哈,没有任何的日志记录相关的信息,那么大家注意这里面的每一个方法是不是都是一个啥来着,连接点吧,哎,那么也就是我们的目标方法啊,对不对,哎,也就是我的目标方法啊啊所以说这个位置的话,大家注意它就是什么,在目标方法执行之前执行,你也可以理解为什么呀,在连接点哎执行之前执行,听懂了吧,OK,那这个东西怎么做呀,注意了啊,每一个通知其实都是通过一个方法来去体现出来的,那么我们要写一个方法,Pass那个好word,比如说呢,我就叫做什么呀,Before method,好,我就叫什么before method,看到了吧,那么你写出来这个方法,它就是一个通知了吗?不是,你还得需要通过具体的注解啊,那么前置通知呢,我们需要用到一个before这个注解。
03:29
大家在导包的时候一定要注意啊,因为这个笔for注解的在我们的整容里面是不是也有啊,对吧,所以说你千万不能导出包啊,我们导入是这样导的是Spark的接这个包下面的看到了吧,哎,不要导出包啊,来before导进来好写好以后呢,那么其实现在它就是一个通知了,但是呢,这个通知我们来看看他在碰错看到没有,为什么会报错呀,哎,注意了啊,他说这个before呢,必须要去定义一个value属性,你看到没有定义的对吧,说什么呀,也就意味着这里面呢,它必须得写个value属性,你看。
04:10
没错。对不对,那也就意味着这里面我们确实是要给人家写点东西了,是吧?而且呢,我们之前说过Y轴是不是可以省略的呀,那我一省略就剩个双引号了,他也不会报错,那问题是什么呀?这里面我们要写什么呀?要目标方法,哎,注意了啊,大家好多同学应该都猜到了啊,我来给大家解释一下,这是我的通知,也就意味着这是一个什么方法前记录日志的这个功能吧,对不对?而我的目标呢,是在我的什么这个类中啊,就在这个接口下面那个实现类中,比如说这个实现类中是不是有这个加减乘除啊,对吧?那我怎么把我这个日志功能给它作用到这个上面呢?这样对吧,你想想这个过程我怎么就能让我的通知知道要作用到哪个方法上面啊方法是吧,说说这个地方,这个过程我们要写什么来着,叫做切入点表达式吗?还记得那个图吗?对不对对不对,哎,要写一个。
05:13
切入点表达式啊,说出现在我们要写切入点表达式了,那么切入点表达式怎么写的,我先来给你写一下啊,就是语法是这个样子的啊excution,然后在这里面我们要怎么去写呢?你就想一下,我要作用到我的这个类里面,你看了哈,作用到我这个类里面的,比如说我先作用到ADDDD方法上面吧,那么我来问大家,你如何去描述ADDDD方法,它在什么地方,这个方法的一些特点怎么去描述啊,是不是包名加类名我能确定到它在什么地方吧,再加上方法名,我是不是知道是哪个方法了,但因为方法有重载的,我不是还得加上参数列表啊,对不对?那么对于一个方法来讲,你这个修饰符以及返回值是不是也是必不可少的是,所以说我们这个方法完整写出来以后,应该是什么样子的呢?我给你写一下啊。
06:13
就是这个样子的,Public int类型的,然后呢,注意了哈,这个接口下面的你看好了哈,就是这个包下面,然后呢,这个类中的一个ADDDD方法对不对?然后呢,这个方法上面呢,还有两个参数分别是什么呀?TT吧,哎,参数的名字还要吗?不要不要不要了,就写两个TT,这就好了,这就是一个代表达式,简单吗?不简单啊,对,说白了就是怎么去找到这个方法诶。是不是,那你来看一下这个能看懂吗?这个方下面的这个类中的这个方法吗?而对于一个方法来讲,你光看名字是不行的嘛,你是不得去关心人家的修饰符返回值啊,是不是得关心人家的这个参数列表啊,对吧,你就完整的我往这一写,这不就是一个切入点表达式吗?
07:13
能明白了吗?那么你把这个写好以后呢,大家注意啊,它就能怎么着了,哎,它就能从这个给你啊作用到什么的,作用到我们的这个类中的那个ADDDD方法上面了。明白了吧,哎,就能作用上去了啊好,我看一下我这个写的应该没问题吧,它一个啊,然后呢,Com啊一直到这这样A啊应该是没问题的啊好,那么我们把这个写好以后呢,大家注意了啊,写好以后接下来我们要做什么事啊,那么接下来要做的事就是你看了啊,那你这个通知你要干嘛呀,你不是记录日志吗?对吧,那我就来看一下啊,我在这里面呢,我就先来简单的去实现一下啊,比如说呢,我就写个什么呀,叫做logging aspect啊,比如说它要记住一个前置通知啊,前置那就是什么呀,比如说这个method方法名,我们是不是也想获取啊,对吧,暂时的话我还获取不到啊,我一会来告诉你怎么获取,比如说谁谁谁begin with了参数我也想获取,但是我也获取不到,我就先写个假的是吧,啊,比如说的啊XY对吧啊,我就把它先。
08:27
写到这,我们先来看一下我这个功能到底有没有能听懂吧,那怎么测试呢?你把这个写好以后,你就正常去测试你这个类里面的这个方法就行了,那我们就去写一个用一个什么呀。又一个class啊,我就在这里面写一个什么呀,慢,好在这个慢类中呢,我们写个慢方法,大家来注意,好写个办方法,慢方法中的话呢,我们需要去实例化我们的LC容器对象吧,好,Ctx就等于,哎,你有一个什么呀,克拉斯pass xma哎,把它留出来,然后呢,指定上你的这个spring减ASPA的J_location的插秒能看明白吧?哎,把它写上,那么把这个家伙写上以后呢,大家注意了啊,接下来呢,我们就来获取谁了,你看看啊,我们来获取我们的,呃,大家注意啊,这个家伙现在有没有管理到LC容器中啊,还没有吧,是不是,我们现在能把它扭出来吗?能拗吗?能自己拗吗?
09:43
你要说自己把它拗了,跟你的spring还有关系吗?没有,没有关系,所以说你不能用,那么你必须得把它管理到我的LC容器中,所以说呢,我在它上面也加上一个component注解理解了吧,OK,好,这个加上以后呢,我们就可以来获取它了,怎么获取呢?你看好了啊,就是a magic calculator,然后呢,我叫做AC吧,等于什么呀,等于ctx叫get b,然后呢,这里面写谁呀?就是ari a magicport是他呀,能看懂吗?嗯,好,把它写到这,那么写到这以后,正常情况下大家注意啊,你觉得这个AC是一个谁呀?是不是我们的这个类型的一个对象啊,好吧,那我就来直接注意了啊,我直接AC点掉ADB方法了啊,比如说我调个啊一加上个一,好,最后呢,它会有一个结果啊,In特列线到。
10:43
Result,然后呢,我来输出一下啊,输出什么呀,在我们的慢方法里面测试的这个result好,加上我们的一个result好,那么这就最好了,可能好多同学还在想代理在哪啊是吧?啊,我告诉你代理就在你眼前,你只不过没有看到他啊运写一下,看结果这出了个错是吧?看什么错啊呃,这个写错了呗,To是吧,少了个啊再来看一下啊啊选中我们来运行一下。
11:26
打错了。报错了哪错了,这输出的东西哪去了啊?我忍了哈,看到效果了吗?同志们,看到了吧?哎,你看一下这个出来了吗?出来了吧,神奇吗?神奇神奇吧,咋咋搞的呀,好多同学还在想,哎哟,你的代理到底在哪呀?你这你要让我看到代理,我还能明白一点,你要让我看不到代理,我我是真想不明白是吧?其实我告诉你。
12:03
既然我ac.ADD调这个方法的时候,我能打印出来我那个日志记录,那我告诉你说明谁呀,说明AC它就是代理对象,明白吗?如果说AC不是代理对象的话,他就仅仅只会执行这个方法里面的一个什么东西,你那个日志是压根不会有的,对吧?所以说我告诉你这个AC我来给你输出一下,你来看看啊,大家有没有想到是它AC get拉掉get内运行一下,稍运一下是吧?来运行一下,这还得点一下是吧?看一下是代理对吗?是吧?OK啊,我要跟大家说这个这个数字你不要去纠结他是吧,你们运钱的时候也不一样啊,是不也不一啊。
13:04
来注意,那我现在呢,就要给大家去分析了,诶那不对呀,我这明明获取的就是我的这个对象,怎么给我的是一个代理对象啊。这就是死lob帮我们做的啊,我怎么给你分析呢?我们就要来看这个东西了啊,一开始我跟大家说过,我加上这个的配置的作用是什么呀?是不是给切面中通知能作用到的目标类生成代理啦,那我们就来看这是我的切面吧。是不是啊,这是我的通知吧,现在我的通知是不是能作用到我的这个类上面了?OK,那么point就会为这个类生成代理,明白了吧?好,而你生成代理以后,你在获取的时候,你在这个地方获取这个对象的时候,本意上你是想获取原本的这个对象,但其实普发现它是被切面通知所作用过的,能明白吗?也就意味着它是被切面通知过的,他就给你返回的是代理对象不给你返回原本的对象,听懂了吗?所以说,那么当我们在通过这个AC去调这个方法的时候,就相当于代理对象调用什么呀?调用我们的代理方法,那么底层就会执行一个引work方法,而在那个引work方法里面,大家其实也能想到了,他会把最终的调用呢,转回到我们的目标对象上。而在目标对象执行这个方法之前呢,它。
14:37
就会执行到我们的这个方法,先执行它,你能想明白这个过程了吗?可以了吧,哎,所以说大家一定要注意,这个位置给我们返回的是一个返理对象,那这就是我们的L。简单吗?简单简单吧,其实你看我啥都没干,写了个切面,写了个通知对不对,写了个切入点表达式搞定了。
15:02
好,那我最后我再来问大家一下,既然你知道了他是一个代理对象,我这个位置能接收成类型的吗?不行,能不能不行,明白吧,肯定是不行的,为什么不行啊,因为你是代理对象,那我们知道代理对象就是有一个接口,下面有个目标对象,然后呢,有个代理对象吧,这两个就是一个兄弟关系,你能把代理对象转换成他兄弟类型吗?能不能不行的,所以说呢,你必须得通过接口来去接受啊,这个话题也是我们昨天讲完动态代理以后,给你们去研究的那个其中一个问题。对吧,啊,所以说这个大家必须得理解了啊,好,那么这就是我们给大家去讲的一个前置通知,而在这个通知里面,我们顺带着把一个切入点表达式就给大家去说了,明白了吧,OK。
我来说两句