00:00
好,下面我们来看一下基于注解的a up的最后一个功能,叫做切面的优先级。那我们现在呢,大家看咱们创建的这个切面叫logo aspect,叫做日志功能的切面,那我们是不是可能还会有一些其他功能的切面,比如说咱们以后会有事务功能的切面,我们还会有一些什么验证功能的切面,比如说我们就拿着我们当前的这个案例来说,我们现在呢,需要来创建一个验证功能的界面,大家看啊,咱们这个类叫什么?叫做valid data aspect。好,它的功能呢,是对我们当前咱们这个计算器里面的加减乘除的功能,对吧,对它输入的这两个参数I和勾来进行一个验证。OK吧,好,那我们现在呢,大家想想,咱们是不是就有两个切面呢?而且它都是作用于我们当前同一个目标对象方法执行的过程中的。那所以说我们当前这个切面里面的这些通知,它是按照什么顺序来执行的呢?来大家看一下啊,那首先咱们先把它配置为一个切面,那大家还记不记得我们在实现基于注解的A的时候的一个准备工作,首先咱们说了,咱们必须要把切面类和我们的这个目标类来作为IOC容器中的一个组件,所以说我们需要在这加上A的component注解。
01:22
然后第二个呢,就是说我们要把当前的这个切,把我们当前这个切面类来标识为一个组件,然后在这咱们需要用到PE的组解,OK吧,选完之后,然后我们是不是就可以在这里面来封装我们当前的横线关注点,把它给封装为一个方法。再通过咱们当前这个注解啊,将这个方法标识为通知方法,大家想一下我们之前咱们在写logo aspect的时候,是不是就是这样的一个顺序,对吧?好,咱们先把方法设置出来,比如说它叫做比赋。Method啊,这个是我们当前一个前置通知的方法,然后我们现在要想把它给标识为一个通知,我们需要用到it before注解。
02:08
好,然后呢,我们当前这个注解报错是因为什么?大家应该也都知道,那是因为咱们的通知必须要套到我们当前的目标对象的方法上,也就是咱们的连接点上,它是不是才有意义,那这里面我们应该用什么,应该用切入点表达式对吧?所以说我们在这就需要去写一个切入点表达式怎么写,Execution,我现在的这个前置通知也是要套到我们当前咱们的这个calculator I PL里面的加减乘除的方法上的,所以说切入点表达式怎么写啊?第一个星来表示的是。任意的访问修饰符和任意的参数,任意的返回值类型。然后下面咱们来写这个包名,com.at硅谷,点spring,然后点aop.on。然后再点calculator I m PL,这是类,然后再点型是我们当前类中所有的方法,然后在这如果说我们不在乎这个方法的参数列表,不管是什么参数列表,咱们都要把当前的通知套到咱们的这个方法上,这个时候咱们在这写两个点点就可以有印象吧。好,那当然呢,大家看,你看咱们在这儿所使用的切入点表达式,是不是跟我们在log aspect里面,咱们所写的这个公共的切入点表达式它也是一样的。
03:29
那我能在这个切面里面来访问我们当前这个切面中的公共的切入点表达式吗?大家注意可以,然后大家看一下怎么写,然后it before,然后这里面咱们直接来point cut,大家看有没有有,只不过就是写的比较长而已。因为我们当前咱们来访问公共的切入点,表达式,你去访问的一个方法。那所以我们是不是要知道这个方法是哪一个类中的,这个类是在哪一个包里面的。OK吧,因为咱们不同的包下面可以有相同的类名吗?
04:01
对吧,然后我们相不同的类中可以有不同的,可以有相同的方法。所以说在这咱们一定要把当前这个方法所对应的类,以及类所对应的包全部都给它写上啊,好OK,那我们写完之后,下面咱们在这直接说出一句话,然后咱们只要来看一下这个效果就行。然后validate aspect来写一个箭头,这叫做前置通知,OK,那下面呢,我们就可以直接来测试了,大家注意不用去改什么别的代码啊,因为我们现在咱们的什么叫a op。那不就是在我们不改变源代码的基础上来进行一个代码的增强。所以说这目标对象咱们需要去改吗?不需要。我们现在只需要把咱们的切面创建好,你把它给配置好,然后我们再把咱们的横切关注点封装为一个通知方法,然后再通过咱们的注解将它作用于当将它套到我们当前目标对象方法上就可以了,OK吧,也就是咱们的连接点上就行啊。
05:03
好,下面我们在这咱们来一个执行。好,大家看一下,你看咱们的valid aspect,大家看是不是跑到这了。是不是针对于咱们的logo aspect,然后是我们当前的这两个切面来说的话,应该是logo aspect,它先执行,执行完之后是不是才执行的我们的valid aspect。那我们现在咱们要做的就是先验证,先执行验证切面中的通知。然后再来执行我们的日志前面中的通知,那这个时候我们应该怎么做?大家注意,非常简单,我们只需要通过一个注解就能来完成这个操作。然后咱们用到什么注解叫做a order注解。然后这个order大家注意,就是优先级的意思。我们当前的每一个切面,它其实都有一个优先级,听好了啊,都有一个优先级。它的优先级我们是通过这个order注解的value属性来设置的,大家看一下啊,在这个位置。
06:05
好,然后我们当前这个优先级,大家看一下,它其实就是一个数字呀,Int类型。OK吧,然后我们所设置的数字越小,优先级越高,所以说我们只需要在这个地方。大家注意在valid aspect的。这个切面上的这个order it order注解的value属性值中,你去设置一个int类型的优先级就可以,你看我们在这咱们写,把它给写出来之后,你看这有这是什么意思?大家看一下我们每一个前面它的优先级是不是都是一个非常长的数字,这是啥呀?2147483647。这个这是什么东西,来咱们来找到我们当前的这个Y流属性,你看它的默认值是order的,然后这个叫做什么。呃,Low low lowest对吧,然后references这是什么意思呢?然后咱们把它给点开看一下,大家看一下,你看刚才咱们那个比较长的值咱们不认识,但是这个咱们总得认识吧,这是银泰的最大值,那我刚才说了,每一个切面都有一个默认的优先级,而优先级越小优而这个值越小,它的优先级越高,那所以我们现在要想让这个优先级高一些,其实很简单,大家随便去设置一个值就行。
07:26
你这个值只要比inter的最大值要小就可以,OK吧?好,下面我们在这儿,咱们再来一个执行,大家看啊。好,大家看valid aspect的前置通知,是不是就先输出了?OK吧,所以这就是前面的优先级,非常的简单。我们只需要通过咱们的一个a order注解,然后来设置一个数值,你让它的这个数值越小,然后它的优先级就越高,而每一个切面的优先级都有一个默认值,是in t的最大值,大家把这个记着就行啊。
08:00
好,那下面呢,我们来找到logo aspect,来咱们看一下,这是咱们的第五个问题,叫做切面的优先级,然后咱们可以通过it order注解的Y流属性,Y流属性来设置优先级,然后它的默认值为什么in tIgEr。的最大值,好,这个大家注意啊。好,然后还有一个大家需要注意的地方,就是咱们it order注解的value属性值。越小。值,然后越小,然后优先级越高,优先级。越高行,OK,这个大家注意,所以说我们只需要通过it order注解的value属性就可以来设置一个切面的优先级。值越小,大家注意优先级越高,那我们现在呢,咱们就可以对吧,我们刚才是不是就可以通过这个a order注解,咱们把它的Y流属性值设置为一能看懂吧,然后这个时候它的优先级一定是比咱们的logo aspect的优先级要高的。
09:12
因为我们不设置it order注解,大家注意它的默认的优先级就是in t的最大值,OK吧,行。
我来说两句