00:00
好,那我们这四种基本的通知呢,就给大家演示完了,然后下面呢,大家来观察一个问题,就是我们当前的这些通知,然后他们的一个执行顺序。就比如说这个应该是咱们的前置通知,然后呢,紧接着应该是我们目标对象方法的执行啊,然后它有异常,咱们是不是才会有这个异常通知,然后或者说没有异常的时候,咱们在这输出的应该是返回通知,然后最后呢,是咱们的后置通知。然后这个各种通知的执行顺序啊,大家注意,然后它跟咱们的spring的版本它是有一些关系的,就比如说咱们来看咱们的笔记,然后在上面啊,在我们去讲各种通知的时候,对吧,然后这里面spring版本5.3之前大家注意啊,然后咱们是先前置再目标操作,然后下面是后置通知,然后最后呢,是咱们的返回通知和异常通知。好,而我们在咱们的5.3版本之后是先前置再目标操作,然后下面是返回通知或异常通知,最后才是后置通知。
01:09
那因为我们用的spring的版本是5.3.1对吧,所以说我们所看到的这个效果就是跟它是一致的,大家来看一下,先前置再方法执行,有异常那就是异常通知,没有异常的话就是返回通知。然后最后呢,我们在这这个是什么叫做后置通知,OK吧,行,那咱们现在把这些这个普通的这个通知呢,咱们演示完之后呢,下面咱们看最后一个,然后叫做环绕通知,比如说我在这先把这个方法呢,写出来叫做avoid,叫做A啊,叫做around advice method,大家注意这个就是咱们的环绕通知的方法,那我们现在要想把它给标识为一个环绕通知的方法,我们是需要用到一个注解,叫做around的注解。当然呢,咱们的通知只有通过切入点表达式作用到连接点才会有意义,所以说我们在这呢,咱们直接加上一个双引号来为它的Y流属性赋值,直接来调用我们当前统一的公共的这一个切入点表达式就行啊。
02:16
好,然后大家来看它的标志,你会发现它的标志是把咱们当前的方法整个的围起来。上面有半个对吧,下面有半个,所以说咱们当前的环绕通知呀,它其实就相当于我们之前讲的那四种普通的通知啊,然后组合到一块的一个效果啊,其实说白了就像是我们自己手动写的这一个动态代理一样,对吧?然后我们是可以自己手动的去设置,手动的在咱们目标对象方法执行的过程中去添加一些额外的操作的啊,那这个时候我们该如何去做呢?那大家想一下,那我们这里面最重要的就是你一定要通过一个方法,或者说是通过一行代码,然后来表示目标对象功能的执行。
03:04
要不然的话,咱们直接在这里面去消去写这个操作,那我们怎么知道这个操作是在哪一个位置来执行的呢?对不对,所以说大家看好啊,我们在这个地方。咱们需要传进来一个比较特殊的类型的参数啊,叫做。叫做proceed,叫做proceeding,然后join啊这东西呢,也是一个接口类型,然后它比较着我们当前咱们的join point这个东西是来获取咱们的连接点的信息。这个是一个可执行的连接点的对象,也就是说这个东西里面有一个方法叫做点proceed方法,大家注意这个方法是用来干嘛的,来表示咱们的目标对象方法的执行。方法的执行,OK,大家注意,这一句话非常重要,这句话就相当于我们在写经动态代理的时候的这一句话一样。
04:00
我们只有了这一句话来表示了目标对象方法的执行,我们才可以在它执行的过程中去加入一些额外的操作。好,然后在这呢,大家来看,然后咱们需要来处理一下这个异常,这个异常我建议大家一定要用TRY开启。为什么呢?因为我们现在呢,要来表示的是我们当前目标对象方法过程中,然后执行的过程中的那四个位置,那所以说咱们必须要有拆开来判断它什么时候有异常。什么时候没有异常?好,在这呢,咱们可以再加上咱们的finally OK,大家注意,那我们现在呢,你看这个方法它是有返回值的,然后是什么,咱们就叫做result,大家注意啊,既然我说了,这是代表了目标对象方法的执行。那我们当前这个返回值是不是表示的就是我们目标对象方法啊,执行之后的一个返回值。好,然后如果我们现在咱们的这个方法是一个环绕通知的话,大家注意我们一定要干什么,咱们一定要将我们当前这个目标方法执行的返回值进行返回,否则的话它是直接报错的。
05:09
OK吧,好,然后所以说那我们现在那换句话来说,就是我们写了环绕通知之后,我们当前咱们的目标对象的方法还会执行不会不会我们就是根据咱们当前的环绕通知去执行这个目标对象的方法的。然后这个时候我们就可以在它执行的过程中去加入一些额外操作,对吧,那你怎么去加,很简单,大家注意,那这个位置它不就是我们当前咱们的环绕通知中的一个前置通知的位置吗。这不是我们的环绕通知里面,咱们在这写一下啊。好,这个是环绕通知对吧,然后来写一个箭头,然后这个是咱们前置通知的位置,来前置通知。前置通知的位置,这个大家注意,然后再往下呢,然后咱们的这个位置,大家说这叫什么通知,返回通知的位置啊,然后这个是什么通知的位置,叫做异常通知的位置。
06:08
然后这个大家注意这是什么,这是我们的后置通知的位置,看好了啊,然后大家一定要看好,然后这个就是咱们的环绕通知,我们其实就是通过一句话来表示目标对象方法的执行,那这个时候我们就可以在目标对象方法执行的过程中来加入一些额外的操作。对吧,这就跟咱们之前写的一个动态代理是一样的,对吧?然后呢,咱们在目标对象方法执行之前,这不前置通知嘛,这不返回通知,这是异常通知,这是后置通知,大家看跟咱们在这写的是不是一样的,OK吧,只不过我们的代码是有所区别的,因为我们之前咱们是手动设置的动态代理的代码,而我们现在咱们是通过a op中的通知来实现的,OK吧,还有一点啊,就是这个方法,大家注意这个方法的返回值,然后必须是我们当前什么的返回值,目标对象方法的返回值。
07:03
因为我说了,我们再去执行目标对象的时候,这就更像是咱们的动态代理了吗?我们现在来执行的是它的环绕通知的方法。然后那所以说大家想想,我现在是用这个方法来代替了目标对象方法的执行,那所以说我们肯定不能保证人家原来有返回值,你现在在这儿没有返回值了,不可能吧,是不是好,所以说啊,大家注意,然后我们现在呢,然后咱们把这个方法的返回值给它设置出来,好,因为TRY里面咱们写的内容呢,它是一个啊局部的对吧,所以说我们需要把它给设置出来,然后在track里面来进行赋值,然后最终呢,咱们在这直接把这个result来进行返回就行啊,Return result。OK,这样就可以啊好,然后咱们把返回值呢,给它改成是object就行。好,下面呢,我们就可以来进行测试了呀,然后咱们的测试代码大家不需要去改,然后咱们在这儿可以改成一,然后我们现在再来执行,然后大家看。
08:04
这个时候我们当前咱们所写的那四种通知,然后还有我们所写的环绕通知,然后它都会起作用,大家看环绕通知,前置通知。然后这个是我们当前咱们的logo aspect是咱们当前的一个这个前置通知咱们所写的内容,然后这个是咱们当前方法内部执行的内容。然后这个是我们当前咱们的这个叫做返回通知,这个是我们当前咱们的后置通知,然后这个是咱们的环绕通知里面相当于返回通知的位置,这个是相当于环绕通知中后置通知的位置。这个大家一定要看好啊。呃,然后呢,咱们不用在意他们之间到底是谁先执行谁后执行的,因为我们以后并不会说对吧,然后我们设置了其他的四种普通的通知之后,我们还会去设置一个环绕通知,这种情况不可能存在,因为大家都知道一个环绕通知相当于这四个通知加起来的一个作用,对不对,那如果我们设置了环绕通知之后,我们就不需要再使用那几种那四种这个普通通知了呀,对吧。
09:12
所以说这个大家注意,这个这个位置大家不需要去管啊,然后咱们以后你要么用到四种普通通知,咱们只针对于某一个位置,然后添加额外的操作,要么大家就直接用一个环绕通知,然后我们就可以自定义你到底要对哪一个位置来进行具体的操作,OK吧,好啊。行,那这是我们当前当前一个环绕通知的一个功能啊,大家注意我们是怎么去写的,咱们需要通过一个注解叫做a around,对吧?然后通过我们当前咱们的一个切入点表达式将它定位到连接点,然后我们在咱们的环绕通知的方法中需要传进去一个参数,叫做proceeding join point类型的参数,然后咱们通过这个参数中的一个方法叫proceed方法,就可以来表示目标对象方法的执行。
10:03
然后呢,我们是不是就可以在方法执行的过程中加入额外的操作,这个就相当于咱们的前置通知的位置,这个就相当于咱们的返回通知的位置,这个相当于异常通知的位置,这个相当于咱们的后置通知的位置,OK吧,还有一点就是大家要注意啊,因为我们说的这个环绕通知是怎么来执行的,它更像是咱们的动态代理,所以说呢,我们现在咱们每一次如果你设置的有环绕通知,那我们每一次都是通过环绕通知的方法来代替目标对象方法的执行的,所以说我们一定要来保证我们当前目标对象方法的返回值是什么,我们当前咱们的环绕通知的方法,方法的返回值也要是什么,这个大家一定要注意啊。好,在这给大家来写一下,好,然后咱们的环绕通知的方法对吧,然后一定一定要和谁要和咱们的目标对象方法的返回值一致,返回值一致。
11:04
好的。选环绕通知的方法的返回值一定要和目标对象方法的返回值一致。这个是我们之前咱们在动态代理的时候,咱们就讲过的。对吧,你不可能说我现在我既然要通过咱们的代理对象,这其实就是我们当前代理对象中的方法嘛。我既然通过代理对象中的方法,然后来间接的去访问目标对象中的功能,那所以你一定要保证他们两个的结果一致,我在这儿呢,我除出来的结果是十,你不可能说在这给我返回一个难,或者说没有返回值,那这是不可能的,对吧?咱们的代理模式只是去添加一些额外的功能,我们能不能去改变咱们这个目标对象最原始的一个效果呀,能不能,不能,也就是说结果咱们是改不了的,我们只能在它实现的过程中去进行一个代码的增强,所以说大家要注意咱们的环绕通知该如何去实现啊。
我来说两句