00:00
好,那我们现在咱们已经将我们的一个前置通知,然后通过切入点表达式作用到了咱们的连接点上,好,那下面呢,我们再来看一下,其实这个就已经变得很简单的了呀,对吧,然后你看我们要现在能实现一个前置通知,那咱们其他的通知,最起码后置通知,异常通知,返回通知,它都是一样的。OK吧,那我们在这咱们来讲一下它的细节问题,因为我们设置的还不是很完美,就比如说我们现在咱们的这个前置通知只能作用于谁ADDDD方法加法运算。能不能作用于我们的其他减乘除行不行不行,为什么?因为咱们在这咱们的切入点表达式写死的,咱们的切入点表达是非常的明确,我就是要去对应咱们calculator I PL这个目标对象中的ad方法的。是不是好,那所以大家想啊。那如果我们现在咱们要把咱们的这个前置通知加入到calculator I PL目标对象的每一个方法上,这个时候我们该怎么去做?
01:05
就是咱不可能说你在这再创建四个前置通知,然后把这个方法名给改了,改成sub,改成ul,改成div,不可能吧,那要这样去写,那还不如咱们的动态代理简单,对不对?好,那所以这个时候我们怎么办,那我们就要从我们的切入点表达式出发,咱们的切入点表达式它的语法其实还是比较复杂的,大家注意啊,好,但是呢,你看我们的笔记里面给我们写的这个切入点表达式的语法,大家看一下,你看这里面东西很多很多。对吧,但是呢,其实我们真正在用到的时候啊,然后我们一般都是这样去用的,大家来看一下,那我们这个笔记里面,咱们所写的这个具体的一个语法,大家下去可以自己看一下啊,我们以后咱们经常用的是怎么去写的呢?Before,然后execution,这是我说的,这是固定格式,知道吧,然后如果我们现在咱们不在乎它的访问修饰符,我也不在乎它的返返回值类型。
02:04
不管是啥,只要是个方法,我都要让我的前置通知作用于它,那这个时候怎么办?写个心,大家注意这个星来表示的是谁,表示的是咱们当前任意访问修饰符和返回值类型,然后下面呢,那我们这个包名大家肯定是要去写的,为什么?因为不同的包下面可以有相同的类。对吧,同名的类,然后咱们这个啊,你包括咱们不同的类中,或者相同的类中,是不是都可以有同名的方法,对不对,所以你一定要把咱们当前这个方法设置的这个信息稍微详细一些啊,好在这咱们是com.a硅谷点spring.AOP点。然后点calculator I撇,这是不是到类了,那我下边我要来表示类中所有的方法怎么写,加个星表示的就是类中所有的方法括号,那这个时候括号里面大家注意咱们也要去写啊,写什么咱们当前的这个括号啊,它表示的是谁?它来表示的是我们当前的方法的参数列表。
03:06
OK吧,好,那我们当前咱们的方法呢,然后大家都知道它存在重载,你这样去写,它表示的就是一个无参的方法。OK吧,那我们现在呢,咱们如果说我不在乎它的方法的参数是什么,只要是个方法咱们都要加前置通知怎么办?在这大家可以去写一个点点。大家注意啊,这个点点点点表示的是谁?表示的就是我们当前这个任意的方法中的任意的参数列表。能听懂吧,好,OK,大家看一下啊,这是哪报的错,是不是少一个小括号啊?啊,然后在这少一个小括号啊,大家注意,你看这个小括号是不是应该跟它是一对的,对不对,然后咱们在这呢,咱们这个表示的是方法嘛,对不对,所以说它需要有一个这个它需要有自己的一对小括号,知道吧,好啊行,那当然不单是在我们当前咱们的这个位置,你能写行,这个位置你能写星,我们当前咱们的这个位置类名的位置也能写星,如果你在这写一个类啊,在类的位置写个星,表示的是当前包下面所有的类。
04:12
这个大家看好,表示当前包下面所有的类,那我们以后咱们就会用到啊,就比如说我们讲完a up之后,我们要讲声明是事物,这个事物我们一般都是把它加到哪一层上,Service层上,所以说我们现在可以去写一个事物切面。把我们当前咱们的事物的代码给它封装为一个通知方法,再把我们当前这个通知来作用于我们当前被需要被事务管理的方法上,那谁需要被事务管理大家说。啊,咱们的service层只要是个方法,是不是都要被事务管理啊?对不对,那所以说在这咱们是不是就可以把这个包定位到我们当前的service的实现类这个包,然后点星表示包下面所有的类,然后再点星表示类中所有的方法,然后再括号一个点,点表示任意的参数列表,OK吧,好,所以大家注意啊,然后在这,那我们现在可以这样去写,然后我们来测试,比如说这个叫sub,然后现在我们再来一个执行,大家注意你不加这个东西,我们如果按照咱们上面的这个这个切入点表达式的话,是可它可是只针对于ad方法的,知道吧,但是我们在这写了星之后,咱们把这两个位置,这三个位置给改了之后,大家来看一下,你看减法运算里面有没有,是不是也有了。
05:34
OK吧,好,大家注意,这是咱们的切入点表达式,我在这给大家写一下啊,好,叫做切入点,然后表达式。然后怎么写,然后我们需要在这啊,大家看好,然后在设置,在设置在咱们标识通知,标识通知的注解,标识通知的注解的哪个属性中,大家注意Y流属性中。
06:03
看好了啊,切入点表达式咱们需要设置在标识通知的注解的Y流属性中,然后它的语法是这样的,Execution,然后咱们把它给拿过来,然后这是我们现在咱们写的最精确的一种方式。OK吧,然后下面我们可以怎么办,大家注意,比如说我们现在咱们可以把它给简写为来,咱们自己再写一遍,这东西是不是可以把它简写为星,然后这个地方咱们可以把它写为星,然后这个地方咱们可以把它写成是点点什么意思,看好第一个星,然后来表示任意的访问修饰符,然后和返回值类型,然后咱们的第二个星,第二个星然后来表示的是什么,来表示的咱们当前类中,然后任意的方法,任意的方法,然后咱们的点点,然后来表示什么,来表示这个任意参数,任意个数啊,或者说任意的参数列表就完事了啊,任意的参数列表,OK。
07:12
行,这是我们当前的一个简写,那当然大家注意,我们在累的这个地方,咱们也可以来写星,好,然后咱们在累的地方,然后也可以,然后使用什么星号,然后这个时候它来表示什么,来表示的是咱们包下所有的类。能看懂吧,表示包下所有的类,当然包里面能不能写也可以,哎,你包里面来写星,比如说咱们在这,咱们在这写一个星,这个时候它表示啥?那在这咱们也写个,那表示的就是我们当前com.at硅谷点spring.AOP下面的任何一个包下面的任何一个类中的任何一个方法,然后他都会加上我们当前的这个通知。能看懂吧,哎,行,这个大家要注意啊好。
08:04
行,那这个是我们当前切入点表达式的一个语法啊。好,那下面呢,我们再来看一个细节问题,那就比如说我们之前咱们在动态代理里边啊,咱们是不是在前置通知的位置,也就是在我们目标对象方法执行之前,然后我们是不是怎么做了,咱们是不是在这个位置,我们要输出的是谁?输出的是我们当前咱们要调用的方法的方法名。对吧,然后还有呢,就是我们当前咱们的这个什么,还有就是我们当前的这个参数列表对不对,那你看我现在我用了前置通知之后,我不知道该咋获取了,这还没有咱们的动态代理实现的功能多,我在这儿是不是连我的这个连接点的信息咱们都获取不到,也就是说我当前要加入通知的这个方法,它的一些信息咱们都获取不到,对不对?好,这个时候大家看好,其实咱们能获取到,怎么获取看好啊,在我们当前咱们的通知方法的参数位置来加上一个叫做join point。
09:06
大家看啊,叫做join point对象,然后这个对象的话,大家注意,你看它就是帮助我们来获取我们的连接点的信息的,换句话来说,你的切入点表达是你定位的是哪个方法,那我们当前的join point,它来表示的就是哪一个方法的信息,比如说join point里面有一个get signnature,然后这个方法就是来获取咱们当前的签名信息的,你比如说呀,大家看好,咱们在这是不是要输出这个方法名,方法冒号,然后大家注意方法从哪来,从我们当前signature里面的get name,这就是方法名,看好啊,这东西是用来获取谁的,获取咱们的连接点所对应方法的方法名。能看懂不好,下面大家再来看在这儿啊,看好下面咱们还要获取谁来获取连接点所对应方法的参数。
10:03
方法的参数,方法的参数OK,然后这个怎么获取draw point.get as,大家注意,这就是我们当前这个方法的参数。能看懂吧,所以说在这咱们怎么办?然后大家看好啊,在这直接加上双引号中间一个逗号,然后参数冒号把谁给加进去AGS,但是这是object类型,输出的是内存地址啊,所以说咱们在这需要点two string,把AGS给它放进来就可以啊。行,下面大家再来看我,现在我来一个执行。大家看你看输出的信息就变了啊,看方法下参数一二能获取到,不能可以啊,所以说大家看这是我们的第一个内容,咱们的各种切面,然后呢,这是我们当前咱们的第二个内容,然后下面咱们再来看咱们的第三个内容,就是来获取连接点的信息,怎么来获取,然后在咱们的通知方法的参数位置,然后来设置什么类型的参数,看好叫join point类型的参数。
11:18
参数。好,然后咱们就可以来获取对吧,然后咱们的连接点所对应方法的信息。啊,连接点啊,就可以来获取咱们的连接点所对应方法的信息,比如说在这儿大家看这是来获取啊,这是来获取对应方法的签名信息啊签名信息。签名签名。啊四信息,好,这个大家注意,这个c nature.get name才是来获取咱们的方法名,知道吧,哎,行好,大家注意,那有同老师,什么叫做签名信息啊,签名信息就是方法的声明信息,什么叫方法的声明?方法的声明,这不就是声明方法吗?这是访问修饰符,这是返回值类型,这是方法名,这是它的参数,这就叫做签名信息,你就像是我们当前咱们如果有个代码,它有异常,我们是不是它给我们提示的时候,是不是里面就有一个把当前的异常添加到签名位置,它里面就有一个signure这个单词,知道吧,那是什么方式,就是在这加上一个Rose。
12:31
OK吧,这个大家可以去看一下啊,行,那这是我们来获取咱们的连接点的信息,好下面呢,在这呢,咱们刚才说到咱们的切入点表达式的,那我们再说一下咱们这个切入点啊,你看就算是咱们这样去设置它,好像也是挺麻烦的,因为你看如果我现在我要再写一个通知,比如说咱们叫帕布,然后wall的咱们叫A,叫做after,叫做after returning,然后advice advice method。
13:05
啊,或者说咱们先写个简单一点的,就叫阿AV SE advice method,行,咱们就写个这个能看懂吧,好,然后现在我们写完之后,你看我现在要把它给标识为后置通知用什么,就叫做after,然后在这我是不是还要把咱们的切入点表达式是不是再重新写一遍,对不对,那这个时候怎么办,大家注意,咱们来讲这样的一个问题叫做。切入点表达式的重用叫做切入点表达式的重用,我们只要把这个切入点表达式给设置一次,然后我们呢,就可以直接来使用我们当前准备好的这个切入点表达式了,怎么写看啊,在这咱们来创建一个方法,这个东西咱们就叫做pointt,叫做point cut point in cut就是切入点的意思啊,大家注意这个方法没有参数,也没有任何的内容,然后我们只需要在咱们当前的方法上加上一个叫做poin,叫point cut的这个注解,然后大家看我在这把咱们下面或者说咱们来自己写一下execution里面是星,然后com.at硅谷点spring.up op点,然后点。
14:21
Calculator I PL,然后点星,这是咱们当前类中所有的方法,然后在这再来一个点点,OK,大家注意,这不就是咱们的切入点表达式吗?那我把它写完之后,这个是用来声明一个公共的切入点表达式,当我们有了公共的切入点表达式之后,我们就可以怎么办呢?大家再看get before里面直接怎么写?看好啊,直接point cut看这个东西是我们当前咱们所设置的公共的切入点表达式这个注解所对应的方法的方法名,咱们在这直接调用这个方法就行。能看懂吧,因为咱们说过这个注解它没啥功能嘛,咱们在这知道是哪个方法之后,那我们是不是就可以来获取这个方法,获取方法上咱们当前所加上的这个注解,然后把它所对应的value流属性值当成是咱们的切入点表达式去定位连接点就行,能看懂吧,所以说在这咱们怎么写呀,也是point in the cut就完事了。
15:22
能看懂吧,这就是什么?这就叫做切入点表达式的重用,OK吧,好在这那咱们。在这来写,这是第三个内容,这是咱们的第四个内容,然后第三个内容叫做重用,叫做重用,然后切入点表达式,切入点表达式。好,然后重用切入点表达式怎么重用,大家注意很简单,咱们在这我直接把这个东西啊,然后给它复制过来,然后我们当前。我们当前咱们的这个注解的作用是用来干嘛的?大家注意a point cut这个注解,然后就是用来声明一个什么,来声明一个重用的切入点表达式,或者说叫做公共的切入点表达式,对吧?公共的切入点表达式,那我们在用的时候,咱们怎么来使用呢?大家注意使用方式,哎,使用方式OK,然后咱们随便复制过来一个注解就完事了,大家注意这括号里面写的是啥?写的是我们当前的这个方法的方法名。
16:32
能看懂不写的是我们当前这个方法的方法名啊,这个大家一定要看好,OK,行,这就是我们当前咱们在写通知的时候的一些细节问题,OK吧啊,一些细节问题,比如说咱们的切入点表达式的语法,然后比如说我们该如何重用切入点表达式,比如说我们该如何获取连接点的信息,哎,行啊。
我来说两句