00:00
好,那我们现在呢,咱们已经了解了A的概念,以及a up的相关术语,那下面的呢,咱们就来实现一下a up,那a up我们在实现的时候用两种方式来实现,首先第一种呢,就是基于注解的a op,第二种呢是基于叉L的op。好,然后下面咱们先来看一下基于注解的AOP啊,首先先看技术说明对吧,然后我们在这呢,咱们所使用的这个注解,大家注意是a aspect的G的注解,然后这个东西呢,它是我们AOP思想的一个重要实现,也就是说大家怎么去理解这个内容,就是说AOP呢,它是一种思想,然后呃,PE既是AOP思想的一种具体的实现方式,哎,这个大家注意,然后再往下,那咱们具体的实现层,那就是动态代理了呗,对吧,但是咱们的动态代理又分为两种,之前在咱们的笔记里面给大家写过啊,在这个位置。好,然后咱们的动态代理有JDK动态代理,然后还有一个是cg lab动态代理,然后这个JDK原生的动态代理呢,大家注意它要求必须要有接口,因为我们最终所生成的这个动态代理类跟目标对象目标类所实现的接口是一样的。
01:13
好,但是咱们最终所生成的代理类呢,它的包是com点3PROXY,这个类名呢是Dollar proxy加上一个数字。好,这是它的特点,所以说呢,它更像是什么呀,就是拜把子模式,然后cg lab动态代理呢,然后这种代动态代理大家注意,然后他不需要有接口,然后我们最终创建的动态代理类是会去继承这个目标类的,所以说呢,它是认干爹模式,哎,这个非常的形象啊,好,然后呢,我们下面咱们再来看啊,然后还有就是aspect的J,哎,然后这个东西大家注意啊,它的本质上啊是静态代理,为什么?因为咱们在这呢,并不会去动态的生成一个代理类,而是把我们的代理逻辑植入到被代理的目标类编译得到的自检码文件中,所以说我们现在是并没有去创建一个动态代理类的,而是。
02:08
把咱们当前所写的这个代理逻辑对不对,然后最终呢,把它给添加到我们的目标类编译成的自解码文件里面来达到这个效果,所以说虽然它的本质是静态代理,但是它实现的效果呢,然后是动态的,这个大家注意,然后这个we呢,是植入器啊,因为咱们的这个呃,PEG它的价包里面呢,然后有这个we这个单词,大家注意是植入的意思啊,好,然后那个这咱们的spring呢,只是来借用了a aspect记中的注解,所以说咱们从这句话也能看出来,A up是思想,然后我们的aspect g是a up思想的一个重要的实现,OK吧,行,那下面呢,咱们就开始来实现一下咱们这个基于注解的a op啊,那我们先来创建一个新的工程,咱们把这些东西都给它干掉。然后来。
03:00
六一个module。Next,然后咱们叫做spring,然后杠a up啊,然后呃,在杠a not on啊,或者说咱们这样吧,咱们就把这个AOP啊放到一个工程中,到时候咱们来起两个不同的包名就行,OK吧,好,com.at硅谷,然后点spring OK。好,那我们现在创建完之后,我们需要来导入依赖,大家看你看咱们的这个笔记上是怎么说的,是在IC所需依赖基础上再加入下面依赖即可,什么意思?也就是告诉我们,我们当前所实现的A也是在IOC容器的基础上来实现的,OK吧,所以说我之前就跟大家说过一个问题啊。如果说我现在问你,我说spring中最重要的一个核心是谁,那必定就是IOC。因为咱们的a op也是在IOC的基础上来实现的,然后咱们再继续往下看,好,那我们现在随便找到一个咱们的这个IOC的一个工程,然后把我们当前咱们的这个依赖呢给复制过来,这是我们当前的这个起unit的依赖,然后这个呢,是咱们的spring的上下文的依赖,对吧?然后咱们把它给复制过来,然后这是一个pack age,然后打包方式为下包,然后咱们再来把dependence is标签写过来,大家注意,这就是我们当前IOC它的一个具体的依赖啊,然后这是咱们的unit的依赖,然后再往下,那我们就只需要把咱们的这个啊a up,然后它的依赖给加上就行,那有同老师你没有导入aspect的J啊,那咱们来看一下,因为依赖具有传递性嘛,对不对,我们在这所看到的依赖是它最终的依赖嘛,不是啊,然后我们现在来导入更新,然后我们来找到咱们的spring,然后杠a op dependenceency。
04:57
大家看这个位置啊,然后我们把它打开之后,你看咱们的spring-or specs or specs是切面的意思,然后这个是咱们spring中来管理切面的一个假包,然后下面大家看它是不是默认,然后就依赖于a aspect g,咱们刚才说过we是植入的意思,OK吧,哎,行,这个大家注意啊,行,那咱们现在把依赖给导入进来之后,那我们下面呢,我们就可以来把咱们的一些资源给准备好了,首先然后我们说了,咱们是不是还得用我们的那个计算器的那个场景来进行模拟,对吧?所以咱们先把包创建出来,com.a硅谷。
05:38
然后点spring,然后点,比如说我们现在要来实现a op,什么方式的a op,注解方式的a op,所以说叫a not ion,好,然后下面咱们再把类拿过来啊,然后找到我们的这个proy对吧,然后来找到我们当前咱们的这个接口,还有这个实现类,这不就是咱们的目标对象嘛,对不对,目标类啊,好,然后复制之后把它给放到这个包下就可以了。
06:07
行,那我们现在呢,咱们的准备工作咱们就做完了,然后下面呢,我们再往下看,你看咱们接口是不是已经复制过来了,咱们的时限类呢,也已经复制过来了啊好,然后下面呢,我们就需要来创建一个切面,然后并且来进行配置。首先呢,大家注意咱们把这个切面呢来创建一下,因为咱们现在是面向切面编程嘛,对吧,我也在讲a op的概念的时候跟大家说过,我们在a op里面你要干什么,你都需要做什么,首先我们需要把非核心业务代码,也就是咱们的横切关注点抽取出来,封装到一个类中,然后这个类就叫做切面,然后我们的横切关注点封装到切面中之后每一个横切关注点都是一个通知方法。OK吧,咱们要把它给创建为一个方法,每一个方法都是一个通知,然后那我们现在通知有了之后,咱们说a op,你不是要光。
07:04
要光把我们当前的这些非核心业务代码抽出来的,我们最终还要把它给套到我们抽取出来的位置,也就是这个连接点,但是连接点它就是一个概念,那我们现在咱们要通过代码把它给定位到咱们的连接点,再把它套到连接点上,那我们是需要用到一个切入点表达式的,大家还记得吧,所以说我们现在要做的任务,大家应该能想明白吧。干什么?创建切面,创建通知,通过切入点表达式把通知作用到连接点完事,这就是我们在a op中要做的这个任务啊好,那首先呢,咱们在这来创建一个切面类,比如说这个切面咱们就叫做关于日志功能的切面,叫log log as叫做log aspect。好,然后那我们现在呢,咱们把这些这个把这个切面创建好了之后啊,大家一定要注意,咱们刚才才说过,我们。
08:03
如果要实现a op的话,它也是要在咱们的IOC的基础上来实现的,所以说我们必须要把咱们的切面,还有咱们的一个目标对象,然后交给咱们的IOC容器管理,这个大家一定要看好啊,在这咱们把spring的配置文件创建出来,这个是a op,然后啊杠叫an not,这是我们通过注解来实现的a op,那在这我们需要干什么?我们需要把这个切面,然后和我们的目标对象都交给IOC容器,看好a opoc,对吧,然后的步骤。A的步骤,首先啊,或者说a up的注意事项事项,好,然后咱们的这个啊,叫做切面类,切面类,然后和咱们的目标类和目标类啊,然后都需要对吧,然后交给IOC容器,交给IOC容器然后来管理,行大家注意,这是我们的第一个注意事项啊,好,那所以说那我们现在要想把这两个类交给IC容器管理,那咱们是不是就有两种方式,你要么自己去配置这个病,要么用注解加扫描嘛,对不对。
09:15
好,然后所以说呢,咱们就用注解加扫描的方式呗,因为这个类是咱们自己创建的嘛,对不对?好,所以说在这咱们来加上一个什么注解,大家想想,咱们标识组建的注解一共有四个,Control service repository,还有个component,那我们当前的这个目标类,它既不是控制层,也不是业务层,也不是持久层,所以说咱们直接用comp就可以啊。好再往下,然后咱们的切面类呢,也是他也不是控制层,业务层,持久层,所以说就是一个普通组件。叫做a compound。能看懂吧,好,然后呢,我们现在设置完注解之后,那我们肯定还需要来进行一个扫描。那扫描怎么写,大家有印象没?然后在这咱们用到的是context的一个命名空间,然后用到的标签叫做compound SPA,然后我们要来扫描的包啊,com.ADD硅谷点spring.aop.on就完事了啊,行,这个大家注意。
10:16
好,然后呢,我们现在这第一个注意事项咱们已经完成了,就是把咱们的目标类和咱们的切面类,然后交给IOC容器来管理,然后下面的呢,我们还要来做一个准备工作,大家注意,因为因为对于我们现在的IOC容器来说啊,这个东西它就是一个什么,就是一个普通的组件,但是我们现在呢。我们要告诉我们的IOC容器它是一个什么,它是一个切面组件,那这个时候大家注意,我们就需要再加上一个注解,叫做PE的注解。这个大家看好啊,咱们用的是哪个包下面的是org.aspectg.long点大家注意用到的是这个注解啊好,通过a aspect的,通过a aspect的这个注解,然后将咱们的当前组件,然后标识为什么组件大家注意叫做切面,好这个大家看好,所以咱们在这呢,也给大家写一下咱们的第二个注意事项,就是咱们的切类,切面类。
11:18
对吧,然后必须通过it as aspect的注解,然后标识为一个切面,标识为一个切面好。OK,那大家注意啊,那我们现在咱们的准备工作咱们就做完了,那下面呢,我们就可以在切面里面来抽,从我们的这个目标,目标对象中,目标类中来抽取咱们的这个横切关注点,然后把它给封装到咱们的切面中。然后呢,把咱们的每一个横切关注点都封装为一个通知方法了,OK吧,好。
我来说两句