00:00
好,那我们当前咱们这个设置通知的时候的一些细节问题,像咱们的切入点表达式呀,还有获取连接点的信息,咱们就已经这个看完了啊,已经给大家演示完了,那下面呢,我们继续来看咱们的各种通知啊,大家看这个通知叫什么叫后置通知,然后呢,切入点表达式,咱们来使用的是这个公共的切入点表达式。然后下面呢,我们在这儿是不是就可以来加入一些内容,比如说那首先咱们先这样,咱们先验证一下,那后置通知大家说这个东西是在哪执行的呀。后置,那我们所知道的,咱们能够操作连接点,咱们能够操作目标对象功能执行过程中的那四个位置,有两个是不是都在咱们的这个啊,目标对象方法执行之后来执行的对不对,有哪哪两个来咱们来找到咱们的。这个动态代理啊。来大家看一下叫proxy factory,大家看一下你看这个位置,这个位置啊,还有这个位置,这两个是不是都是在我们当前咱们的目标对象方法执行之后。
01:07
能看懂不?这个地方大家看这是不是在之后,这是不是也是在之后,那我们当前的后置通知到底是这个位置执行的,还是这个位置执行的呢?对不对,那咱们下面咱们就测试一下呗,叫做log of pack,然后逗号,然后叫做后置通知,哎,叫后置通知,然后我们直接来执行就完事了,对不对,因为我们说了你还需要去改别的东西吗?你还需要去改我们当前咱们的这个目标对象吗?不需要啊,因为a up本身就是来做代码增强的,在不改变源代码的基础上来添加一些额外的操作,对不对,这样的啊。好。那大家看一下,那现在咱们还看不出来对吧,因为一个是在目标对象方法执行之后,一个是在finally里面,所以说我们要想测试的话,直接用谁测试div对吧?一除以零这个时候有异常,如果这后置通知它还能输出,那就说明啥?那就说明后置通知是在finally里面执行的。
02:08
而如果说我们当前有异常了之后,这后置通知它就不输出了,那说明它在哪执行呢?在咱们当前目标对象方法执行之后来执行的,也就是返回值之后,OK吧,行,下面我们在这再来一个执行,大家看。好,大家看一下您后置通知书出了没有输出了,那说明在哪执行呢?大家想一下,是不是应该是在我们的目标对象方法执行的finally里面来执行的啊,行来咱们的第二个叫做after after这个注解干啥的,它叫做后置通知,然后它是在哪在目标对象方法的finally finally子句中执行的,子句中执行的,OK。行,这个大家注意啊,好,那我们在这儿呢,让咱们别的咱们也输出不了,咱们一般都是在这里面来关闭资源嘛,是不是,那所以说我们给它加上一个方法吧,比如说方法,然后冒号,然后呢,咱们在这来获取我们当前的一个签名信息,大家直接复制过来就行啊好啊,在这呢,我们是不是也要来加入一个join point,来获取我们当前的连接点的信息,对不对,然后在这怎么写方法,然后叫做point啊。
03:28
好,把这个删掉,然后加上一个join point,然后叫做get,叫做啊不对啊,是我们上面获取的签名信息,然后点get name完事,然后再加上双引号逗号,叫做执行完毕,执行完毕行,就这样就可以啊,下面我们在这儿咱们再来一个执行,大家看啊。好,那大家看一下,你看这是不是我们当前咱们的log aspect,然后为我们的目标对象中,然后来添加的一个后置通知啊,行,那下面呢,我们再来看咱们剩下的两种通知,然后一个通知叫什么呀?一个通知叫做返回通知,一个叫做异常通知,然后咱们先把返回通知创建一下public void,然后叫,然后叫after returning re returning a the advice method,行,好,然后大家看,那这个时候我们需要用到咱们的什么注解呢?叫做it after,然后returning就可以了。
04:36
好,然后这个时候大家会发现他并没有报错啊,然后并不是说他就不须要切入点表达式,那么不是,那不可能,我们当前的通知必须要通过切入点表达式来作用到连接点,它才有意义,对吧,所以说在这咱们同样是要有切入点表达式的,然后但是大家看一下啊,你看咱们这里面啊,这个value。我们是必须要设置的,因为这是设置切入点表达式的,然后下面在这还有一个returning,那首先呢,咱们先这样啊,我先把切入点表达式给设置出来,就是point cut,然后在这个地方咱们直接来输出一句话叫做log aspect,然后这个叫什么通知,我说了叫做返回通知,叫做返回通知,那返回通知是在哪执行的呢?你看大家看这个图标吗?你看这个图标是不是直接在我们方法执行之后执行,这个其实也是在方法执行之后,但是在这多了一个箭头,看到没有,这个箭头什么意思,是返回值的意思。
05:38
然后是在目标对象方法返回值之后,然后来执行的一个通知,OK吧,然后在这大家看啊,我现在我来一个执行,大家会发现诶。它有没有被输出呀,你看这里面大家看一下有没有被输出,没有被输出,为啥呀?因为我们当前咱们的方法执行的过程中出现了异常,对吧?然后呢,有异常了,它怎么可能会有返回值呢?对不对?所以说你的返回通知什么时候执行的,是在咱们返回值之后执行的,那它有异常的,它都没有执,没有返回值,那在这它怎么执行返回通知呢?对不对?好,咱们只要把这个东西给改了就可以,大家看,然后一一,然后下面我们在这咱们再来一个执行。
06:25
好,大家看,你看是不是就都有了返回通知,在这是不是也给我们展示出来了,对不对,所以说返回通知大家注意它是在哪执行的,其实说白了啊,然后咱们把factory proy factory拿出来,它其实就是在这个位置的。看到了没?就是在我们当前咱们的目标对象调用方法返回值之后,然后来执行的就是这个位置,所以说它有异常了,它会执行,不会不会他没有异常的时候它才会执行,OK吧,这个大家注意来。那我们在这里面咱们来写一下,然后咱们的第三个通知在这呢,叫做eight after after returningun,好,然后这叫什么通知,叫做返回通知啊,行,然后它在什么时候在目标对象方法啊,返回值之后,然后来执行,哎,这个大家注意。
07:21
行,那咱们既然是在返回值之后,那大家说我们在这个方法,在这个通知方法里面,我们能不能获取咱们的连接点的信息啊,大家注意,绝对没有问题,叫做join point join point一样的操作,那咱们在这里面就改一下呗,那大家想想我们平常咱们在这个地方我们都干啥了,咱们是不是要把我们当前的方法名输出,还要把我们当前咱们的这个方法执行的结果输出,目标对象方法执行的结果输出,对不对?好,那我在这要想获得方法名,那老简单了,咱们之前就已经获取过两次了,咱们只需要在这个位置来获取什么呀,来获取我们当前的签名信息,连接点的签名信息就行,在这直接一个加叫做CNT.get name,再加双引号逗号,那结果怎么获取呢?大家想一下。
08:14
大家知道为什么在这能获取结果吗?因为它执行的位置是在返回值之后,那所以说我在这个位置一定是能够获取这个结果的,能够获取目标对象方法执行之后的返回值的,能看懂吧?好,那关键在这怎么获取大家看好它的方式啊。这个没有什么难的地方,它其实就是一种配置方式,然后大家把这种配置方式给记着就行,比如说大家看看你看在这个地方啊,在我们当前it after returning这个注解里面,它有一个什么属性,叫做returning属性。叫做returning属性,这个returning是用来干什么呢?比如说我在这设置一个result,然后这个东西就是来设置我们当前的,我们当前的返回通知中用来接收目标对象方法的返回值的参数的参数名。
09:07
哎,这说的老麻烦了,这啥意思,大家看好,说的简单一点啊,就是你只需要在这设置一个object类型的result,你只要这个名字和这个名字保持一致,那我们当前咱们的这个result就是用来接收目标对象方法方法的返回值的。能听懂吧,这个大家注意,所以说returning这个属性干嘛的,来设置接收目标对象方法的返回值的一个参数的参数名的。能看懂不啊,行,大家注意,我在这给大家来写一下啊,好,然后我们现在要干什么。好,然后在这呢,咱们啊,要想在咱们的啊,然后咱们再返回通知中,对吧,然后若要获取,若要获取咱们的目标对象,然后方法的返回值,然后咱们只需要干什么,只需要在只需要通过这个eight after returning。
10:09
对吧?通过it after returning,然后注解的什么属性值叫做returning属性值?Returning属性值好,大家看啊。行,然后咱们只需要通过我们当前it after returning注解的returning属性,不是属性值啊,是是这个属性对吧,然后就可以将然后咱们这个通知方法的某个参数,然后指定为接收。这个啊,目标对象,目标对象啊,方法的返回值的参数。能看懂吧,咱们只需要通过这个属性就可以将通知方法的某个参数指定为接收目标对象方法的返回值的参数,也就是说你只要保证他俩的名字一样,那当前咱们的result,它就来表示的就是目标对象方法执行之后的返回值,知道不行,下面咱们在这来加上一个什么,直接加上一个result来大家看啊,我们现在咱们再来一个执行。
11:23
好,大家看一下,你看结果一这有问题没有,这个没有任何问题吧,咱们再来测试一下其他的一些数据啊,比如说在这咱们来写一个对吧?十然后在这咱们来写一个二,然后下面咱们再来一个执行,大家看这个结果是不是就要变成五了,因为咱们现在测试的是这个除法运算。OK吧,哎,啊,这是我们的第三个通知,叫什么通知,叫做返回通知。好,那下面呢,我们再来看咱们的最后一个通知,咱们的普通通知中最后一个通知啊,然后叫什么叫做eight after after throwing。
12:04
干啥的叫做异常通吃,哎,有的地方呢,它也叫什么呀,他也叫做。啊,例外通知,因为这个exception它本身就有这个例外的意思啊,那异常通知在什么时候执行,大家注意在目标对象方法的什么子句中叫做catch,叫做cat ch catch子句中执行。那这个大家都知道什么什么意思吧,是不是应该是有异常的时候,然后来执行的通知。那我们下面咱们可以写一下,然后叫做public,然后word一个AF aftering throwing a advice method行。好,然后我们在这呢,也是通过一个注解,将它指定为我们当前将它标识为咱们的异常通知,叫做阿如。
13:00
好,然后括号里面咱们是不是也要来写个切入点表达式呀,叫point cut,完事。然后这里面咱们来直接输出一个信息,叫做log of respect,然后咱们的方法同样的输出一下,然后冒号来获取我们当前的签名信息,啊在这咱们是不是也要加入这个join point这个参数对不对?好,然后join point。行,然后在这咱们怎么获取方法名CNT,然后点get name,然后最后咱们大家看到咱们就先这样去写啊,或者说咱们先加一个普通信息,然后逗号,然后这里面咱们写一个叫做异常通知,行,异常通知叫做异常。通知行啊,好,下面我们在这一个执行,大家说这东西你能看得到,不看不到,因为它是有异常的时候才执行的,你看人家这个标志对不对,然后这是方法,然后在这画了一个闪电,就是什么呀,就是有异常的时候,知道不有异常之后,然后咱们就会来执行这个通知,好,但是现在咱们没有异常,那咱们就给他造一个呗,十除以十除以零对不对,数学运算异常,下面咱们再来一个执行,大家看啊。
14:16
好,大家看一下异常通知是不是就有了,那我们的异常通知里面我们一般都要做什么对吧?比如说我们现在咱们既然是日志功能,那咱们总得来记录一下到底是因为什么而出现的异常,到底出现的是什么异常,对不对,所以说大家看好,那我在这儿我要做的一件事情就是要把咱们的异常给获取到来,加上个冒号,把异常展示出来,对吧?给记录下来,怎么来获取异常看啊一样的,跟咱们的after returning一样,在这我们需要用到一个属性叫什么属性,叫做throwing的属性。然后它也是来设置一个名字,然后也是通过我们所设置的这个值,可以将咱们当前通知方法的某个参数,然后来设置为目标对象方法所出现的异常的参数,OK吧,好,逗号里面怎么写,那你在这既然这是获取异常的,那你肯定要写异常类型啊,咱们在这写个exception也行,或者说大家来写一个叫什么叫做throw able也可以。
15:21
能看懂不?哎,在这写个死入A部也行,然后在这咱们直接加上ex就完事了,然后下面大家看好,我们在这咱们再来一个执行,然后我们就可以看到它所抛出的异常信息了,大家看是不是arithme exception,然后by zero是因为为什么是除以零才报的数学运算异常。OK吧,所以在这咱们也是把它给写一下,跟他一样啊。好,然后咱们在这个异常通知,咱们在异常通知中对吧,然后若要来获取目标对象方法的异常的异常对吧?只需要通过it after throwing注解的什么属性叫做throwing属性,OK,然后就可以将通知方法的某个参数指定为接收目标对象方法出现的异常的参数,哎,出现的异常的参数。
16:19
好啊,这个大家注意,其实说白了就是来保证这个名字跟这个名字一致,那咱们当前的这个参数就是用来接收目标对象方法执行过程中所出现的异常的。OK吧,行,大家注意,这就是我们当前咱们的一个这个咱们所讲的这四种通知啊,因为咱们的第五种环绕通知呢,它其实就相当于我们的这个动态代理一样,对吧?然后咱们自己可以控制,然后在目标对象方法执行的过程中的方法执行之前返回值之后,对吧,开启里面还有final里边咱们可以自己去指定这个位置啊,这是在环绕通知中,那所以咱们先把咱们简单的这四种通知先给大家来说一下,因为咱们的最后一种环绕通知,那其实说白了就相当于it before eight after it after throwing eight after returning这四个通知加在一块的功能是不是好啊。
我来说两句