00:00
好,那我们学学完了这个代理模式之后呢,我们就可以来学习这个a op相关的一些内容。那首先呢,咱们先来看一下这个A的概念以及相关术语非常重要,因为我们在讲a op的过程中,然后咱们说的一些相关术语,如果大家听不懂的话,那我们再学习a op的时候就比较困难。好那我们先来看这个的概念,A叫什么呢?叫aspect oriented啊,Programming,它是一种设计思想,叫什么思想,叫面向切面编程的思想,跟咱们的o po叫做面向对象编程,那它们两个之间有什么关系呢?大家注意,然后a op面向切面编程,然后是咱们的op op面向对象编程的一种补充和完善,就比如说之前呢,咱们说过这个日志功能,咱们很难抽取出来,对吧?其实咱们还有一些功能呢,也是跟它一样的,就比如说咱们之前讲过的事物,对吧?事物大家都知道,咱们该如何去实现呀,然后我们是不是需要在咱们功能之前执行之前,然后去关闭事物的自动提交。
01:06
嗯。通过try catch呢,然后来判断我们当前功能执行的过程中有没有异常,如果没有异常,则提交有异常回滚,然后并且在最后咱们的finally里面是不是要来关闭资源,对不对,是这样的一个过程,那大家说这个功能你能抽出来吗?咱们也抽不出来呀,为什么?因为它不是一段连续执行的代码。那所以说咱们用面向对象的思想,那你能把咱们当前事物相关的代码给它这个进行处理吗?处理不了啊,那所以这个时候咱们怎么办,咱们就可以使用a op,因为o op叫做纵向继承机制,而咱们的a op叫做横向抽取机制,然后这个时候咱们就可以把咱们的一些非核心业务代码,然后把它给抽取出来。那为什么它叫做面向切面编程呢?那是因为我们现在咱们把一些非核心业务代码抽取出来之后,我们要把它给就我们要把它交给咱们的一个切面类来进行管理,但是大家要注意,我们从最开始咱们讲代理模式的时候,咱们就说了,你不是要把它抽取出来这么简单的,我们还要把它给套到我们当前咱们真正实现功能的位置。
02:19
也就是说你像咱们的日志功能,我们现在是不是可以把它给抽取到我们的代理类中,然后我们最终是不是还要把咱们的这个代理类里面的这些日志功能,把它给套到咱们的目标对象上,对不对?这个大家一定要注意啊,好,然后所以说咱们的a op,然后它就是干什么的,我们现在咱们来学a up,咱们学的是什么?就是你要把非核心业务代码,把它给封装到我们当前的切面类中来进行管理,然后这是第一点,这是抽,然后抽完之后大家注意我们还要去套,把我们当前抽出来的这些代码,再套用到我们当前抽取出来的位置,然后这个时候我们就能够达到一个什么样的效果,大家注意啊,是在不修改源代码的情况下,然后给程序动态统一添加额外功能。
03:10
是不是跟咱们的代理模式的效果是一样的。OK吧,所以说a up它的底层其实来使用的就是咱们的代理模式。好,那咱们知道了它的概述之后,那下面呢,咱们再来看一下相关术语啊,那这个概述呢,我再跟大家说一遍啊,我们现在咱们主要要来做的事情就是两个事情。首先第一个把咱们的非核心业务代码抽出来,交给谁来管理,交给咱们的前面进行管理,然后我们抽完之后,咱们并不是要把它,仅仅要把它抽出来,我们还要把它给套到我们抽取出来的位置。就跟咱们的代理模式一样,对吧,然后你把它抽出来之后,我们最终是不是还要把它作用到咱们的目标对象的方法中,对不对,对吧,这个大家一定要注意啊好,下面那我们来看它的相关术语,首先第一个叫横切关注点,什么叫做横切关注点?
04:08
大家听好了,横切关注点就是我们当前咱们从我们的目标对象中所抽取出来的非核心业务。咱们从目标对象中抽取出来的非核心业务,比如说我们在之前写这个代理模式的时候,咱们的日志功能针对于我们的计算器的功能来说,它就属于非核心业务代码,那这个东西就叫做什么呀?就叫做横切关注点。大家注意叫横切关注点,我们当前咱们的一个方法中,它可以有多个横切关注点。也就是说我们可以抽取出来的东西啊,非常的多,所以说大家要知道什么叫做横切关注点,就是我们从我们的核心业务代码中所抽取出来的非核心业务代码。举个例子,就是我们在咱们的计算器里面,然后所写的这个日志功能,这个日志功能就是我们当前的核心功能中的非核心业务代码,OK吧,这样的啊好,那下面呢,我们再往下看来大家注意第二个叫做通知,什么叫做通知?
05:18
我们现在呢,然后咱们要把我们的这个横切关注点呢,把它给收集到我们的一个类中,或者说我们是把咱们的横切关注点封装的我们当前的一个泪轴,然后这个类叫什么,这个类就叫做切面,而我们当前这个切面里面,我们所封装的每一个横切关注点,它都是一个通知。换句话来说啊,大家注意你的非核心业务代码,他在我们的目标对象中,它叫做横切关注点。你把它抽取出来之后,咱们把它给放到一个切面类中来进行封装,那我当前的横切关注点在切面中,它就表示为一个通知方法。
06:03
大家注意。所以大家要知道什么叫通知。什么叫做横切关注点?横切关注点是对于咱们的目标对象来说的,是咱们抽取出来的非核心业务代码。通知是针对于谁说的?我们要把这些横切关注点封装到咱们的切面中,而在这个切面里面,每一个横切关注点它都表示为一个通知方法。大家注意。好,然后那我们的通知呢,它一共分为五种,首先第一种叫前置通知。什么叫前置通知?就是我们当前目标对象方法执行之前要执行的内容。什么叫返回通知?在目标对象方法返回值之后来执行的一些内容。什么叫异常通知?目标对象方法出现异常时。执行的内容后置通知。目标对象方法执行的finally中来执行的内容,什么叫环绕通知?相当于上面这四种,其实就相当于我们在这给大家写的这一种。
07:10
能看懂吧,咱们在这一个环绕通知,相当于咱们上面所讲的这四种通知,这个大家注意啊,好,然后下面呢,我们再往下看,那咱们的通知有了,那咱们的切面呢,大家再来看啊。我们刚才说的这个切面其实就是来封装咱们的横切关注点的,然后切面封装了横切关注点之后,一个横切关注点它就表示为一个通知方法,那换句话来说,什么叫切面?封装横切关注点的类就叫做切面。我们也可以说封装通知方法的类,它就叫做切面。因为咱们说了你的横切关注点是针对于目标对象说的,而咱们的通知是针对于切面来说的,你把横切关注点把它给抽取出来,放在咱们的切面里面之后,我们当前的横切关注点就被我们就需要把它给写成是一个通知方法,OK吧,这个大家注意啊,所以说大家要知道什么叫切面封装通知方法的类,那所以说为什么咱们这a op叫做面向切面编程啊。
08:19
为什么?就是因为在面向切面编程里面,其实谁最重要,就是我们当前的切面以及切面中的通知重要,因为这些东西就是我们从核心业务代码中你所抽取出来的非核心业务代码,OK吧,这样的啊,比如说我们从咱们的加减乘除里面所抽取出来的日志功能,对不对?OK,好。下面呢,我们再来看一下叫做目标,什么叫目标?其实指的就是咱们当前的目标对象,我们要进行功能增强的对象,也就是我们现在咱们要抽取非核心业务代码的这个对象。能听懂吧,大家注意,这就叫做目标对象,然后再往下大家来看一下代理,那什么叫代理?代理其实就是我们为当前的目标对象所创建出来的代理对象。
09:10
然后在我们的a op里面,这个代理对象它需要我们自己创建吗?大家注意它不需要,因为它封装的是代理模式。所以说我们并不需要手动的去创建代理对象,我们也不需要去手动的去创建一个什么代理的工厂,不需要,然后这个代理他是我们的a op帮助我们来创建的,OK吧,哎,这一点大家注意非常方便。所以说咱们的a op叫面向切面编程,谁最重要?切面最重要?你只要找到咱们的目标对象之后,你要干什么,那我们就开始来抽取横切关注点,把它给封装到一个类中,这个类就叫切面,你封装到一个类中,咱们的每一个横切关注点,咱们都要把它给写成是一个方法,而这个方法它就叫做通知。这个大家注意好,下面呢我们再来看,大家注意在这有个连接点。
10:05
什么叫做连接点呢?连接点大家注意,就是我们抽取横切关注点的位置,就是说我们当前你的横切关注点是从哪儿抽出来的?比如说我们是从咱们当前的ad,也就是这个加法运算里面抽取出来的。对不对,比如说我们现在咱们是从我们的方法执行之前,然后抽取出来的,那大家注意,那这就是一个连接点。然后或者说我们是在有异常的时候抽取出来的,那这就是咱们的第二个连接点,或者说我们是在finally里面抽出来的,那我们现在这就是第三个连接点。所以说什么是连接点,大家记好,是你抽取横切关注点的位置,那我们为什么要知道连接点?我再说一遍,你的a op面向切面边程,你不是要光抽的,我们不但要抽取出来,咱们最终还要把它给套到,你从哪抽出来的,你就要把它给套到哪,大家说是不是这是,这才是在不改变源代码的基础上来进行一个功能的增强,加入一些额外的操作。
11:13
好,这个大家一定要注意,所以说咱们为什么要知道连接点啊,就是说你从哪抽出来的,咱们还要把它给套到哪,大家注意这个套啊套啊行,然后下面大家再来看,那这个连接点呢,大家听好了,你不用说这个把它说的有多标准,就是说咱们用什么一个非常标准的概念去形容它,大家只要能理解就行,知道吧。好,下面大家再来看切入点。啥叫切入点?大家注意这个切入点,它其实它的本质,它就是一个表达式,它就是一个表达式,然后我们的连接点,大家注意这个东西它是一个纯逻辑的概念,因为它指的就是一个位置。它是语法定义的吗?不是,而我们当前咱们的这个切入点,大家注意,这才是从代码的层面,然后来表示咱们连接点的一个位置。
12:06
换句话来说,切入点是干嘛的?定位连接点的方式,因为连接点它是一个纯概念性的问题,那我们现在咱们说了,你要干什么?A op,把非核心业务代码,也就是横切关注点抽出来,抽完之后我还要把它给作用到我们当前,把它给套到我们当前的你抽取出来的位置,你抽取出来的位置叫什么连接点?那我们现在连接点就是一个概念呢,你怎么从代码层面把咱们的这个通知。作用到套到我们当前的连接点上呢?大家注意用这个切入点,因为切入点是从代码层面来说的,它是一个表达式,我们就可以通过这个切入点来定位我们当前的连接点,OK。那大家注意啊,那我们现在咱们这几个。这个相关术语咱们说完之后啊,然后下面大家想想,你说我的a op,我到底应该怎么做。
13:03
首先你要想实现a op这个目标对象,他肯定是提前就有的。也是我们当前分析过之后,我们有了目标对象,我们才需要通过a up来对它进行功能增强的,所以说大家注意这个目标肯定是有的啊好,下面这个代理咱们说了,A op里面代理对象需要我们自己创建吗?不需要,那所以说我们现在在A里面你要干的是什么,听好。从我们的目标对象中把非核心业务代码抽取出来,那这个非核心业务代码叫什么?叫横切关注点,你抽完之后要把它放在哪?放在一个类中,这个类叫什么叫切面?我们在切面中,然后我们该如何去封装我们当前的横切关注点呢?每一个横切关注点它都是一个方法,而这个方法叫什么叫通知?好。那我们当前切面有了,那我们说了,切面是用来封装咱们的通知的,而通知就是横切,关注点就是咱们抽出来的非核心业务代码。
14:07
那大家说下一步你要干嘛了,你是光需要抽吗?你抽完之后,那目标对象里面没有这个功能了呀。我们是在不改变源代码的基础上,然后来做功能增强,也就是说你不但要把这个功能抽出来,我们还需要把它给套到我们当前的目标对象上。所以说你从哪儿抽出来的,我们就要把它给套到哪。你从目标对象执行之前抽出来的,那咱们就要把它给套到目标对象执行之前。如果你是目标对象,执行之后,那咱们就要把它套到你抽取出来的,你抽取横切关注点的位置。那这个位置叫什么叫连接点,但是连接点它就是一个概念,就是一个位置,那我们现在从代码层面该如何去定位到这个连接点呢?我们要用谁要用到切入点?大家注意啊,就是这样的一个过程,所以说a up里面我们主要干什么。
15:05
抽核桃。抽横切关注点,封装到切面中。它就是一个通知,咱们再通过切入点,然后把它定位到咱们的连接点,OK,然后这个时候就可以再不改变咱们目标对象代码的同时,然后把我们当前切面中的这些通知,然后呢,通过切入点表达式套到我们的。连接点上来实现一个功能的增强。OK吧,好,希望这个大家一定要能听明白啊,听不明白的话,大家一定要好好的去思考一下。因为我们在讲下面咱们基于注解的a op和基于这个叉L的a op的时候,这些相关术语咱们是会经常说的,所以大家一定要知道它是什么意思啊好。那下面呢,咱们再来看那a up的作用是干嘛的?首先第一个简化代码。对吧,咱们把方法中固定位置的重复的代码给抽取出来,就比如说给大家举一个最简单的例子,两个例子,第一个咱们刚才实现的。
16:09
计算器里面的这个日志功能对不对?好,我们其实用动态代理,咱们在实现的时候就已经很好实现了,咱们还需不需要把加减乘除的每个方法里面都需要手动去设置这个日志功能,日志功能吗?不需要。那我们的a up在写起来的时候,它会更简单一些。对吧?咱们要做的事情,那不就是把日志功能抽到我们的切面里面,在切面中是一个什么表示为一个什么通知方法,再通过切入点表达式,你从哪抽出来的,把它套到哪不就完事了吗?对不对,还有就是咱们的这个什么呀,叫做事物功能,你看咱们后边咱们把这个a op讲完之后,咱们要来讲一个问题,叫做声明式事务,什么叫声明式事务,其实就是通过咱们的a op来实现的一个事务管理。
17:00
OK吧,事物代码大家应该也都知道吧,你会发现事物的代码它是一模一样的。每一个方法,咱们只要想被事物,咱们只要是被事物处理的这些功能,它的代码都是一模一样的。方法执行之前,关闭事物的自动提交,用拆开启来判断当前功能是否有异常,有异常回滚,没有异常提交。然后最后在finally里面来关闭资源,对不对。是吧,好,这个时候大家想,你光用面向对象这东西你能抽吗?抽不出来呀,我们得用什么,咱们就得用面向切面来抽,因为它是分布在我们功能执行的过程中的,而不是一段连续执行的代码,OK吧?好,下面呢,咱们再来看它的第二个作用,叫做代码增强。把特定的功能呢,封装到千面类中,看哪里有需要就往上套。你就比如说我们之前你大家看一下咱们写的这个静态代理,咱们写的这个动态代理。
18:01
虽然说这个东西啊,它也简单。要比我们的静态代理要好很多,对不对?但是我们在使用面向切面的时候,我们当前咱们的这个切面类是不是也同样具有相同的功能?比如说我这里面抽取出来的非核心业务代码,也就是横切关注点,就是管理日志的。或者说来是来实现咱们的事物的。那这个时候,当我有了这个切面之后,大家说谁需要进行日志管理,或者说谁需要进行这个事务管理,我们只要把这个切面通过切入点表达式把它给套到咱们的连接点上,这不就没问题了吗?对不对,所以说大家要知道,这个代码增强其实就是在不改变源代码的基础上。然后来进行一个把咱们的这个切面,然后套到我们当前的这个目标对象的方法执行的过程中就可以啊。好,OK,那这是我们的a up的概念以及相关术语,还有一个它的作用,大家一定要把这些问题啊,都给它想明白了,OK吧。
我来说两句