00:00
各位同学大家好,下面呢,我们继续来演示,基于注解方式实现。A,刚才呢,咱们演示了前置通知,那下面呢,我们把其他几种类型通知给各位分别进行演示,那下面呢,我们来写里边的这个通知,呃,咱们先写个后置通知吧,其实先写哪个无所谓啊,咱为了就是看的更明确,我先来个后置通知,我们刚才提到了,咱们看一下啊,刚才讲的这个通知里边。说一下这个后置通知,后置通知什么意思呢?在被代理的目标方法最终结束之后执行,它的执行是在返回通知之后进行执行,那咱们先写一个后置通知,我们看该怎么做,首先啊,我在里边建个方法public we,我叫after method。然后在这个方法上面,咱们加上一个注解,这注解就叫做after after里边同样加上咱们这个叫切入点表达式,这表达式给各位再来写一遍啊,第一个固定单词execution。
01:10
然后加上访问修饰符类型,这位置我就写个号了,后面加上你要增强方法所在那个径,咱把这部分给他复制过来,然后加上我们方法,我就写个号了,再加上里的参数,写两个代表参数,这就是切入点表达式,然后写完之后在方法中咱们可以做一个输出,我来输出一下啊,就输入这个叫后置通知。写到这里。所以这个我们就完成了,然后完成之后呢,这里特别说明啊,在咱们做通知的方法里边,其实是有这么一个参数的,这参数叫做draw point,就咱说的切入点,通过这个参数能获到你通知中一些相关的信息,大家给他也用一下啊,Point。
02:04
然后通过这个我们可以得到一些信息,比如说得到什么,你当前这个增强的方法名字,可以得到当前一些参数啊,但是如果有参数把参数可以得到,那咱把它那个方法名字给他得一下,应该是这个。点get这个这个得到就是你增强那个方法的名字,咱们method啊,后面加上一就这个。小D位置。增强的方法的名称,我们是这个名字。包括这个前置里面给它也加下啊,我把这句话我就复制了,因为他们是一样的。给他拿过来。直接复制一下,然后改成这个前置通知。包括在这个前置通知里边,应该还有这个参数,咱们把它的参数给它也获取一下。
03:00
我写到这位啊,用draw里边。有一个方法叫get as,然后它返回的是一个object数组形式,把这数组我们就直接在里边给它输出一下就可以了,我给它写到我们的这个位置。呃,这里。然后加上我们那个叫参数。啊,参数。然后参数呢,咱把这数组直接输出一下。用这个叫A点上小写啊。点上to,然后把这个给他输出一下,所以现在啊,这个咱们就加上了,这是写到后置通知我们再看一遍啊,然后最终最后进行测试。做法就是前置通知几个方法,后置写方法,加上不同注解,里边加上切入点表达式,然后在方法中有个参数叫注意point,能得到通知的情况信息,包括你增强的方案名字,包括你的参数里边都可以得到,所以这个我们就完成,完成之后咱们做个测试,试一下它的效果,看它是怎么样的。
04:20
那咱来看一下啊,大家看啊,前置通知后置通知这是核心的那个功能,是不是咱们做到了,包括你看啊方法名字参数,这里边是不是都进行了输出,所以以上啊,这个后置通知我们就完成了。这个后置写完之后呢,下面呢,我们再写一个返回通知,我们把五种通知类型咱们都写一下,那我加上一个方法public,我这个方法叫returning method。加上这个方法,然后方法里边也有这个参数,叫draw point,我就直接复制过来。
05:02
啊,包括里边应该也是有他这个方法跟他应该一致的啊,这个咱就给他直接拿过来了。然后这个我改成叫做。返回通知。这个我们就完成,完成之后在它上面加上一个注解,这个注解after。Returning里边加上我们这个切入达,我再写遍后面extion加上星号,加上你的这个。包类的全路径。把这个加上,然后咱们加上任意的方法。加上任意的参数,现在这个就完成了,这是咱们写的返回通知,但是写完之后呢,大家注意啊,返回通知呢,跟后置通知啊有一个最大的区别,首先后置通知在返回之后执行,然后它为什么叫返回通知呢?因为它能得到你增强到目标方法的返回值,比如说我这个方法最终相加一个结果,最终相减,相乘、相除,是不是都有结果返回,我在反应通知中可以把这个目标方法返回值最终就得到,还有这个特点。
06:20
那怎么做呢?咱们在这个after returning中,我们可以加上一个属性,这属性就叫做returning,然后加上returning之后给你这个返回的这个参数,给它起个名字,比如说我叫result,注意啊,这名字可以随便起啊,咱就叫result。然后我。注意啊,这个名字随便起,但你这个参数跟它必须要一致,比如说你这个假如说啊,我叫AA,那我这里边也必须叫AA,这两个必须要养。
07:03
我们都叫result,这result就是咱们增强到目标方法的返回值,那咱们把这返回值给它,也最终做个输出。我写到这里啊。就是我们那个目标方法,它的返回的结果。然后这个结果我们叫。所以现在啊,里边这个返回通知,还有后置通知我们就完成了,完成之后咱们现在来个测试,看一下目前是怎么样的一个效果,那我们来试一下啊,咱们计算二和三相加。大家看结果啊,前置通知这是正确的,然后再来看啊,返回通知是不是有结果。这个是后置通知,所以咱们把这两个就完成了。各位记住它这个参数在返回参数中除了Y6之外,还有一个属性,它叫做returning,能得到增强的目标方法的返回值。
08:04
这是我们写到的,然后这个之后呢,下面还有两个通知,一个叫异常,一个叫环绕,那我们继续来看啊,咱们先说这个异常通知,看他是怎么样的。那我这里边说明啊,什么叫异常通知,给大家写一下啊,它指的就是你的目标方法,当他执行过程中出现了异常,然后这个通知会执行,也就是说你的目标方法没有异常,这通知是不会执行的,包括在里边获取到你那个异常的信息,就在这个after returning中能够。获取到。我们那个目标方法的异常的信息,这是咱们说的特点,那下面我们来快速写一下啊,因为结构都差不多,我就把它呢快速复制单给他快速改一下,结构都类似的啊。
09:03
我就用这个快点改一下。首先啊,这个注解改一个after子柔影啊,就是异常一个通知,然后加上切入点表达式,这个没有什么变化,这个方法改一下after,如。这个,然后在里边还是得到这个方法名称啊,包括在里边咱写一个叫异常通知。这是我们写到的啊,然后写的过程中刚才提到我能获取目标方法异常信息,所以在里边呢,我们可以再加个属性,这属性就叫影,加上我们这个就是名字,比如叫ex啊,叫别的也可以,我就叫这个ex的简写,然后在里边接收到这个异常信息,加上一个叫子绕AEX,跟刚才那个返回一样。两我啊是都这个我们目标方法的异常信息。
10:09
那我们来写一下啊。就是异常信息。咱们是这个,所以现在这个就完成了,但是完成之后呢,比如说我现在啊,我把这个行下,咱看它是什么样的效果。你看啊,异常通知没有执行吧,为什么?因为我现在目标方法没有异常,他肯定不会执行,所以咱们为了测试,我这么来做,我在目标方法中给它手动,咱给它加上一个异常,我手动就写个异常,比如说来一个int啊,比如这个A等于这个除以零是不是异常,咱为了测试。在这里啊,为了测试让他。模拟一个异常的出现。
11:00
这里边应该是零,不能做除数异常,然后这个写完之后,咱们再做个测试,试一下这个效果怎么样啊,我们来最终看一下。然后大家看它是怎么样一个结果啊,我们看结果中呢,好像还是没有异常通知啊,咱们看一下是不是写错位置了啊,我们看一下,呃,我们看啊,我好像写错位置了,应该写到我们那个A的方法中,因为咱掉头A的方法啊,给它换个位置,刚才是写错位置了啊,我写到这个方法中,不是A的方法中了,那我在A的方法中把这给它加上。注意别加错啊,然后咱们再做个测试,我这里调的是A的嘛,这个方法出现异常它会执行,那咱们啊最后试一下。大家看效果啊,最终你看是不是有异常的出现了,然后大家看这里边啊,这是异常的一个信息,看这位置。前置肯定会执行,然后核心功能执行在这里边,你看啊,这个异常通知是不是执行了,然后这里边有你的异常信息,就是零不能做除数,然后过程中发现后置也执行了,但你发现那个没有执行,返回通知是没有执行,因为它出现了异常,它就没有进行返回,但是后置通知是不是一直都会执行,你可以理解为啊,这个后置呢,就类似于我们那个Java中那个开中那个finally,跟那个有点类似。
12:25
所以现在啊,咱就演示出来这个异常通知效果,这个咱就做到了。异常通知写完之后呢,我们再看最后一个通知叫环绕通知,那环绕什么意思呢?大家看我这段话这里写到啊,如果说啊,你使用了try catch final这个结构,那咱在环绕中能够实现出上面的四种效果,前置返回、异常这效果应该都会出现。那咱们说一下什么意思啊,我们继续写一下环绕,简单理解为在之前之后都会进行执行,那咱们写一下最后这个通知,因为跟前面类似,我用它还是咱们快速改一下啊环绕通知。
13:07
环绕用的注解叫around。过来,然后这个方法改成around。麦的。这是我们写到的啊,然后在这里边呢,它肯定是没有这个属性,我把它去掉。那咱们把这个代码写的详细点啊,Around这个。包括啊这个给它也去掉。然后咱们写到详细点啊,首先用join得到你的方法名称啊,包括里边应该还有它那个参数分,把参数给它得到一下。用这个draw point里的方法get as得到是一个数组。这个,然后咱把数组给它后面做个输出,就转成那个字符串啊,用a.to string加上这个值,最终变成的是一个字符串,我们叫arg。
14:11
啊,这个string就是它了啊,这时候我们得到几个值,然后得到之后,下面呢,咱们做这个具体内容,刚才咱们提到,如果说你写上TRY开finally,应该能实现我们这里边的各种效果,就上面四种通知对应的位置应该里边都能看到,比如说你前置位置,返回位置,异常位置,后置位置应该都能看到这个环绕里边的信息,那咱们写一下啊,我在里边呢,先加上一个这个结构,就是try catch finally。咱们直接啊捕获它那个叫子肉able。这个异常啊,Able。这个给他写上,然后再加上一个叫带,然后在里边写一下啊,首先在TRY里边呢,我们先做一个输出,就是它那个环绕通知,我们可以理解为在目标方法之前执行。
15:09
写一下啊,环绕通知,虽然它是环绕,但是却能占据其他几个通知的位置,都能看到环绕通知这个信息。写一下啊,就是目标方法我们进行执行,这是第一个。然后这个之后第二部分呢,因为咱们要里边有目标方法,所以第二部分呢,我们就去让那个目标方法执行,或者说调用这个目标方法,因为它执行,那怎么做呢?用join里边有个方法,这个方法。给大家写一下啊,这方法它叫做。这个叫。Proceed这个方法,那我们给他写一下啊,但是发现这里边好像没有啊,那我们看一下是不是哪里写错了啊,我们看这个参数部分,呃,这个参数呢,应该不是用join point了,它有另外一个就是更增强的,因为能让你的目标方法执行join point中为这个方法,它这个类叫做draw point,应该是它。
16:15
你看啊,通过它能让这个执行,但是它是怎么样继承作胖的,它比这个负类中有更强大的方法啊,就是比这个负接口中有更强大的方法,它能够让你的目标方法进行执行,所以咱用这个进行实现。那我现在来调里面这个方法叫proceed,最终进行执行,执行之后它有一个返回结果,咱们叫这个result啊result呢,为了一会儿方便在那外边做个定义。写到这里啊,就写到外面来。这位置,呃,给他来一个那。这是我们那个得到这个结果。然后之后我们再做个输出表示在目标方法。
17:02
它这个返回值之后啊,就是它有一个返回值,在这个之后进行执行。写一下啊,就是目标方法。这么写目标方法,它那个返回值之后。进行执行,这是写的第二部分,然后再来看下面是不是有个开,那就是它的异常,那咱们加上一个信息,比如我就要写一下,就是环绕通知。呃,这个啊,环绕通知。它就表示在里边目标方法出现异常的时候,执行出现异常执行这句话。然后除此之外还有一个叫拜那里,拜那里边是什么呢?就是目标方法执行完成或者执行完毕之后执行,就是咱说那个我们刚才说的里边的这个通知叫after后置通知,在你的方法执行的最后执行,就是在返回之后执行,那我们放到这个final里边,表示目标方法执行完毕。
18:12
他这个时候执行。这是我们写的一个基本结构啊,当然里面有异常信息,异常信息咱可以把它做一个输出。点上这个信息啊,给它打一下就可以了,所以现在啊,这就是我们说的环绕通知,咱就完成,完成之后最后呢,咱把这个效果我们来最终看一下啊,啊当然过程中呢,其实你可以把这个啊,因为环绕通知里边有一个返回值,你可以把返回值做个返回,当然也可以不返回,咱就写的完整点啊给它就是。返回一下吧,把这返回值。我就写到这位啊,比如我叫这个object。这里边我们做一个。瑞。这个object。啊,给他就是返回家啊,就这个result这个纸。
19:04
所以现在这部分我们就最终完成了。那这个代码呢,完成之后,最终我们来测试一下啊,试一下最后结果咱们来试一下啊,看它的效果怎么样。咱们执行。然后大家看啊,首先在方法前面是不是有环绕通知,包括你看在后面有这个环绕通知,在这里是不是有异常,包括执行完毕,因为现在里边有异常,所以它没有那个返回结果,那我现在比如说啊,把这异常给它去掉,是不是去掉异常,咱们再做个执行,看目前的效果。大家看里边啊,你看啊,在前面。环绕通知,在这个反应之之后,通知包括有最终执行完毕,是不是有通知,这个就叫环绕通知,就环绕到你方法之前之后,所以以上啊是咱们演示的五种通知类型,大家把这记住。
20:00
然后这里边分别就是前置通知、后置通知,返回异常,还有这个环绕。另外过程中有一些相关参数特别注意,环绕通知中用它里面一个子接口叫proceed join point,它里面能调用你的目标方法,然后通过它能输一些相关的信息,包括里边还有一个切入点表达式,可以记住它的基本语法。所以咱们现在基于注解方式,把a op中的五种通知我们就完成了演示。
我来说两句