00:00
好,那我们学习了基于注解的a op之后啊,下面咱们来学习一下基于XML的a op。然后这个东西大家只需要去了解一下就行啊,然后咱们主要以这个注解为主,OK吧,行。那大家要知道他们的思路是一样的,咱们都需要做什么来封装横切关注点,然后把它封装到切面中,然后呢,把横切关注点封装为一个方法,咱们再把这个方法呢来设置为我们当前的一个通知,然后再通过切入点表达式定位到连接点就行,OK吧,好,那所以咱们只需要将我们之前呢,咱们这个a op功能的注解给它删掉啊,然后通过咱们的配置文件中的标签来配置就行。好,那这个东西具体该如何去实现呢?来大家看一下,咱们首先先来创建一个包,比如说这个包咱们就叫做叉ML,好,然后下面把咱们的这些内容呢,然后把它复制过来一份放到咱们的叉ML这个包下面。
01:00
好,然后下面大家看一下咱们都需要去改什么啊,首先呢,接口不需要做任何更改,然后这个目标类咱们也不需要进行更改,为什么呢?首先大家注意,然后我们的a op,它的作用就是在不改变源代码的基础上来进行一个功能的增强,所以说咱们在这儿呢,咱们不需要做任何更改啊,有田老师这个注解需不需要删,不需要,咱们说的是将A功能的注解删掉,那这是实现A的吗?不是,这是来实现IOC等IOC管理并中的一个注解,OK吧,像下面呢,我们再来找到咱们的切面啊,然后咱们把这里面的这些注释呀,然后把它全部都给它删掉,然后呢,那我们就把咱们这个AOP功能的这个注解也给它删掉就行啊,那哪些是属于AOP功能的注解呢?大家看这个东西是不是?将当前组件标识为切面的注解,对不对?把它给干掉,然后呢,咱们当前来设置切入点表达式的注解,然后干掉,还有就是我们把方法标识为通知方法的这个注解,咱们也要把它删掉,其余的东西咱们都不需要去动啊,就比如说我们来获取连接点的信息,在我们当前的参数位置,通知方法的参数位置加上一个join point类型的参数,这东西咱们需要什么?不需要大家注意你,哪怕咱们用的是叉ML的方式来实现a up,我们要想获取连接点的信息,也是这样去做的,OK吧,包括我们来获取咱们的返回值,包括咱们获取目标对象方法执行过程中的异常也是一样的。
02:33
好,那咱们把这些注解删掉之后,然后我们下面咱们的valid aspect也是aspect注解删掉,It order注解也把它删掉,还有就是我们当前it before这个注解啊,大家注意好,那我们删完之后,咱们下面咱们再来创建一个什么,再来创建一个spring的配置文件。那大家想一下,现在咱们就非常明确了呀,对吧?然后我们是不是只需要把咱们当前删除的这些注解所实现的功能,通过咱们的配置文件中的标签来配置就行啊,啊叫什么叫a op,然后猫,然后杠啊叉名就可以啊,那大家再来看,那我在这呢,我并没有去删除掉咱们的A的component,对吧?然后这是为什么?因为咱们之前就说过啊,你要实现a op PA opoc实现的过程中也是以IC容器为基础的,所以说它仍然是要求我们的目标类,还有咱们的切面是IOC容器中的一个组件啊好在这大家注意,那我们在这儿首先咱们要扫描组件,因为咱们光加注解不行,咱们基于注解来管理,并用的是注解加扫描的方式啊。
03:43
好,然后context的冒号啊,然后我们在这呢,咱们需要用到的标签叫component,看标签,然后咱们需要来导的包啊,需要扫描的包,Com点艾硅谷,点spring.a up点叉苗,大家不要写错了,然后再往下,那我们就可以开始配置了呀,然后下面大家注意这个标签我们现在还需要设置吗?叫做aspect的G-auto proxy需不需要不需要,我们之前咱们说过这个标签有什么功能,叫开启基于注解的a op,那我们现在咱不需要用注解的,那所以这个标签就不需要来设置了啊那我们现在需要用的是什么标签呢?啊a op啊,大家注意这个标签咱们就不需要去写了,那现在咱们需要用的注体用的标签是什么?大家看好用的是a op冒号con标签。
04:32
咱们需要用到的是这个标签啊,然后这个标签就是来进行一个a up的配置的,看好它所用的也是咱们的A的命名空间,好然后呢,咱们把它给写完之后,下面大家看一下它的子标签都有什么二四。AOP冒号aspect的干什么的,将咱们的一个组件,把它给设置为切面的,然后AOP冒号adviser干嘛的来设置我们当前的通知的,当然这个标签我们目前咱们用不上,我们什么时候才会用,在我们讲完a up之后,咱们的声明式事务里面会用到啊,然后这个呢,是来设置咱们的切入点表达式的,OK吧,那所以说大家想想,我们现在切面已经有了,咱们当前咱们的方法呢,切面中的通知咱们也已经有了,当然现在还不是通知,只是一个普通的方法,那我们要做的就是把咱们当前的这个组件啊,给它设置为切面,并且把咱们切面中的方法来设置为通知就行。
05:32
因为毕竟咱们删除的注解,它实现的功能就是这样的,对吧?好,所以说我们需要用到的第一个标签,大家看好就是它。然后呢,我们在这来写一下注释,这个标签是干嘛的,是将咱们IOC容器中的某个组件对吧,或者说叫做某个并对吧,然后来设置为切面啊,设置为切面,大家看这里面的属性,你看啊,有个ref什么意思引用。
06:01
大家看一下啊,这个ID是唯一标识,这order就不用说了吧,这是干嘛的设置切面的优先级的,所以说我们现在只需要通过ref来引用某一个B的ID,就可以将当前这个B来设置为一个切面。好,下面大家看一下,那咱们选谁呀?大家看这是不是有log aspect,这是不是有validd aspect,那咱们是不是只需要在这呢来选择log aspect就行,那唐老师为什么会有这个东西,为什么?因为我们当前的前面用注解加扫描的方式,是不是将它配置到了我们的IOC容器中,然后呢,所以说呢,注解加扫描的方式所配置的bin的ID默认就是类名的小坨,这个类名首字母小写的结果为ID,也就是他的小驼崩。所以说大家注意,虽然咱们在当前的IOC容器中,咱们没有配置这个病,但是经过注解加扫描,它是有这个病的,所以说咱们在这儿可以直接去写OK吧,然后下面大家注意,你看这个不就相当于a a aspect标it a aspect注解吗?那再往下我们要干什么?咱们是要是不是要把咱们切面中的方法来设置为通知,这个时候怎么办?看好这里面的标签啊,叫a up冒号,大家看一下。
07:16
知道这是干嘛的,不A冒号比负,然后将咱们的某个方法来设置为前置通知的方法。Around环绕通知after throwing,异常通知after后置通知after returning返回通知,这个是用来干嘛的?设置咱们的切入点表达式的,OK吧?所以说我们现在咱们只需要来使用a op冒号before,大家看它是不是会自动帮助我们来使用这个method的属性,Method什么意思?方法,那不就是将咱们的某一个方法来设置为咱们的前置通知的方法吗?对不对?所以说大家来找一下在这是不是有个before advice method,然后咱们现在呢,直接来选择这个方法就行,但是你会发现他选完之后他报错了,对吧?报什么错?那其实这个标签的作用不就相当于it before吗?但是大家不要忘了,你的it before里面还可以干什么?将咱们当前的通知定位到连接点,通过切入点表达式定位到连接点,所以说这个标签为什么错,简单就是因为我们当前咱们没有写切入点表达式,没有意义,知道不好,那我们怎么去写呢?你看这个。
08:23
标签里面有两个这样的属性,一个叫point cut这个东西干嘛的,那这个时候我们就需要自己去写切入点表达式了,然后或者说我们也可以来使用什么,咱们也可以来使用point cut-ref干啥的,来引用我们某一个公共的切入点表达式,那大家还记不记得我们之前呀,咱们在AOP冒号config的子标签里面,咱们是不是看到过一个AOP冒号point card这东西干啥?就是设置一个公共的切入点表达式的,大家看啊,来设置一个。公共的切入点表达式,OK,这是它的ID,比如说咱们就叫做point cut,然后下面这是咱们当前的切入点表达式,然后excu,然后下面第一个星来表示的是任意的访问修饰符和返回值类型,然后com.at硅谷,然后点spring.a点记好啊,这是叉苗,知道吧,再点calculator I PL,然后点星表示这个类中所有的方法,然后加上括号点点来表示的是任意的参数类型,OK吧。
09:36
好,写完之后,那我们在这就可以来引用了呀,直接引用point in the cut就行,OK,就这样去写,大家看,所以说你看咱们现在在叉ML里面配置的是什么,其实就是通过咱们的标签去代替我们之前咱们通过注解来实现的功能,OK吧,好,下面呢,我们继续来AOP,然后冒号after,然后method,等于什么叫做after advice。
10:02
After,然后advice method就行,然后point card跟ref,还是point card就完事了,然后再往下AOP,然后冒号after returning,然后method,等于after returning advice method,好,然后大家再看,你看这里面还有什么啊,这里面是不是直接有个returning属性,记不记得我们之前咱们来标识咱们的返回通知的这个注解叫it after returning里面是不是也有一个returning属性,对不对?干啥的来将咱们的某一个参数指定为接收目标对象方法执行之后的返回值的参数。OK吧,直接把result来指定为接收这个这个接收返回值的参数就行啊好,下面还有就是它的切入点表达式,然后叫point cut,完事就这样,所以说啊,大家注意,咱们学了基于注解的AOP之后,你会发现基于叉L的AOP对吧,思路非常的明确。
11:02
是不是好,下面咱们再继续往下,然后叫after throwing,然后等于这个method,咱们是哪个,叫after throwing advice method,然后这里面大家看是不是同样也有个throwing属性干啥的,来设置接收我们当前目标对象方法抛出的异常的一个参数,对吧,Ex就完事了啊好,下面来引用切入点表达式,OK,然后最后一个a op,然后冒号叫做around,这是咱们的环绕通知叫around a method,然后下面呢,也是一样的point the card-ref,引用切入点表达式完事。能看懂吧,好,下面咱们就可以来进行一个测试了呀,来找到我们的AOP test这里面好像不太对啊,因为我们在这所引入的都是啥呀,都是allation下面allation这个包下面的类对吧?那咱们把它的名字给改一下吧,叫做a up,然后by all。
12:00
行,然后test,然后来重命名一下这个文件,然后下面我们在这咱们再来创建一个类叫a by叉ML test OK,好,来创建一个测试方法public VO,叫做test AOP,然后BY叉L行该怎么去写啊,Application context IOC等于另一个可拉pass叉l application context,然后把我们当前的配置文件拿过来,叫A杠叉ML,对吧?然后写完之后呢,通过IOC来获取我们当前的这个病。那你说怎么获取啊,大家想想,你能直接获取咱们的目标类所对应的对象吗?不行啊,咱们说了,你用了AOC之后,我们的IOC里面压根连目标对象的病都没有,对不对?我们之前给大家测试过,我们在这儿只能来获取什么,只能来获取什么,只能来获取我们当前的目标类所对应的代理类对象,但是咱们不知道它叫啥,没关系,但是咱们知道它实现的接口叫做c later,这个大家注意啊。
13:05
还有印象吧,跟咱们之前写的一样,然后下面calculator点,比如说ADP方法一逗号一来,下面咱们来进行一个测试,大家看有没有效果啊,我们现在来执行对吧,如果说的正确的话,它应该是。跟我们之前用注解来实现的功能是一样的,对吧。好。那现在咱们来进行测试。大家看你看它有问题没有,是没有任何问题,对吧?这是我们的logo aspect里面的前置通知,然后这是返回通知,这是后置通知,然后这三个是它的环绕通知,OK吧,行,那下面呢,那咱们把这个设置完之后,那我们是不是还有一个切面,怎么设置,大家注意跟它一样啊,然后AOP,然后冒号aspect,然后呢,通过咱们的ref来将我们的valid aspect来设置为切面,然后设置之后再通过a op,冒号before,然后将我们当前的某个方法来设置为前置通知的方法。
14:08
OK吧,然后再通过point card跟ref来引用我们当前公共的切入点表达式就完事了,然后下面我们在这再来一个执行,大家看啊,来看看咱们的validd aspect是不是就有了,是不是啊,那如果我现在要想来设置它的优先级,怎么设置啊?大家记不记得我们之前在奥派的这个标签里面是不是看到过一个order属性?大家注意,这就是来设置它的优先级的,然后现在我们只需要在这来写个一,那它的优先级就一定要比它的优先级要高,OK吧,现在我们再来一个执行,大家看啊。好,大家看,那我们当前咱们的valid aspect的优先级是不是就要高一些了,行,这个大家注意。这个大家还有印象吧,咱们说过你设置的值越小,优先级越高,它的默认的优先级是银泰的最大值啊,这个大家注意行,那这就是我们基于XL的a op,大家注意非常简单,我们之前咱们是学过基于注解的a op的,所以说它的思路一样,那我们做的事情其实就是要把我们当前咱们这个啊,通过注解来实现的a up的功能,然后把它给换成是通过咱们的叉L中的标签来实现。
15:22
对吧,然后咱们都替换了哪几个标签,你替换了哪几个注解,首先第一个it aspect。这个注解是将咱们的组件然后来标识为一个切面的,我们是不是在这通过a op和aspect的标签来代替的?然后还有一个是a point cut这个注解来设置一个公共的切入点表达式,那我们是通过哪个标签来代替的?通过这个标签代替的。对吧,然后我们的it before it after it after throwing it after returning,还有it around这些将方法来标识为通知的这些注解,那我们是不是通过咱们这里面相对应的这些标签是不是进行代替的,对不对?所以说大家注意,咱们只要来实现一个,然后咱们有了思路之后,其实这个a op啊,在实现的时候还是非常简单的啊,行,OK,那咱们的a op呢,咱们就说到这儿,然后下面呢,那我们就要来学习这个a op的一个重要应用叫什么呀,叫做声明式事务,对吧,其实咱们来学习这个AOP最重要的啊,咱们就是要来通过它来实现一个事务管理,因为我们这个事务管理就是我们最典型的一个什么呀,就是公共的代码,但是呢,咱们却抽取不出来,因为咱们事务操作大家想一下都是一样的过程啊,我们需要先干什么,咱们需要先将这个什么事物的自动提交给它关闭掉,然后再往下有异常回滚,没有异常提交,然后再。
16:47
Finally里面,然后再去关闭咱们当前的资源,关闭我们的链接,大家说是不是,但是这个东西以我们之前学习的oop,咱们能把它给抽取出来吗?你抽不出来,因为oop是纵向集成,你只能去封装一段连续执行的代码,对不对?那现在咱们有了a up之后,那大家说我们可不可以去创建一个关于事物的切面,然后因为我们当前的事物操作是分散在我们目标对象方法执行的那四个位置的,所以说你要么用前置、后置、返回异常这四个通知一块去写,你要么用一个环绕通知,是不是也行啊,大家说对不对,对吧?好,所以说啊,我们学了a op之后,我们就要来学习a op的一个重要应用,就要声明式事物。
17:34
老师,这东西不需要咱们自己去写吗?这个事物的切面不需要咱们自己写吗?不需要,因为在我们当前的spring中,它为我们提供的有专门的事物管理器,其实它就是一个切面,也就是说咱们该如何去处理事务,这个切面已经帮我们写好了,我们要做的事情就是把这个切面呢,把其中的通知来作用到我们当前需要被事物处理的方法,也就是咱们的连接点上就可以啊。
18:02
好,OK。
我来说两句