00:00
好来都要注意了啊,那么接下来呢,我们就来正式的去讲解我们里面的这个a op了啊,那么首先呢,呃,我们还是先来解决一些比较头疼的东西啊,就是这个概念性的性啊,概念性的东西是吧?啊就是不好记对吧,还比较多啊,但是呢,我们还得去学,呃,先来说一下什么是AOPP啊,AOPP呢,其实它就是一个面向切面编程啊,它是一种新的方法论啊,它是一种新的方法论,是对传统的o op,也就是我们的面向对象编程的一个补充。能理解吧,啊,那么其实这个地方呢,还有一个概念啊,什么概念呢?我简单的给大家去说一下,就是我们传统的这种o op呢,它其实是一个什么呀,纵向的继承机制,啥叫做纵向继承机制呢?你就来想一下,在你这个面向对象里面,我们基本上所有的类都是有一个层次结构的,对吧,比如说我有个A,然后呢,A比如说有个子类,那就是一个B,比如说呢,A还有一个父类,那就是什么呀,比如说C吧,对吧,它们之间的关系呢,都是一个什么,纵向的继承的一个机制。
01:11
你想想是不是op op里面是不是就是这个样子的,对吧?它这段有个这概念,就是它是一个纵向继承机制,而我们这个a op是一个什么概念呢?它其实表达的是一个横向的抽取机制啊,横向抽取的横向抽取就是那个抽取出来嘛,对吧?横向的抽取机制啊,它表达是这样一个概念,那么其实现在说这个东西的话,你压根就听不懂是什么意思,对吧?所以说呢,现在我们只需要知道一下有这么个东西啊,你看我压根就没有写出来,也就代表着你知道不知道也无所谓了,对吧?但是我可以给你提一下啊,它是一个横向抽取机制啊,那么我们可以在后面的学习过程中呢,大家呢,慢慢的去理解一下什么叫做一个横向抽取,对吧?来什么叫做一个横向抽取啊,好吧,那我们这个就简单说一下啊,来接着往后看,呃,那么对于我们这个a op的这个编程来讲,我们主要编程的对象是什么呀。
02:08
就是切面吗?面向切面,面向切面吗?那主要编程对象不就是切面吗?对吧,你想想你面向对象的编程,主要的编程对象是什么呀?不就是对象吗?对不对?所以说这个LP它主要的编程对象呢,就是这个切面,那这个切面又是一个什么东西呢?啊,现在大家听我说啊,你可以把这个切面理解为就是一个很普通的一个类,明白吧,但是这个类呢,它有一些特殊的功能啊,还有一些特殊的功能听懂了吧,这个地方专业术语呢,叫做什么呀?叫做模块化,就是这个横切关注点,模块化以后,那么就是一个切面啊,说白了什么意思呢?就是这个横切关注点呢,我们可以把它当成是一个什么各种各样的一些功能,明白吧,就是你想去实现的一些功能,比如说我在方法前记录日志,这是一个功能,方法后面的记录日志,这又是一功能,方法抛出异常呢记录日志,这又是一个功能。你把整。
03:09
整个的这些功能呢,给它模块化,什么样的模块化呢?就是给它全部都提取出来,然后呢,给它生成一个类,就是形成什么这样的一个类,这个类呢,就是专门来去做日志的啊,我既可以在方法前,方法后,方法框中异常的地方等等都可以给你做日志,那么你把这些横切关注点抽取出来以后啊,这个家伙它就是一个切面,明白了吧,先来简单理解这个概念啊,我们后面呢,还会跟大家去说到啊啊然后我们在使用这个LB编程的时候呢,其实我们仍然需要定义这个公共的功能,但是呢,可以明确的定义这个功能在哪里,以什么方式去应用,而且呢,不必要去修改受影响的类。听懂了吧,啥意思呢?我们来举个例子啊,我们在之前没有使用动态代理的时候,大家来去想一下我们写的那个加减乘除,再结合上日志,我们来想那个日志,日志它其实就是一个公共的功能吧,对不对?因为我这个模块里面可能会用,那个模块里面也有可能会用,对不对,它就是一个公共的功能,但是我们那个公共的功能有没有明确的定义,它在哪里啊,没有吧,是你哪哪个地方想用,我是不是直接在哪个地方给你加上了,对不对,OK,好,那么我们有没有去想一下,它是怎么去给你作用上去呢?也没有,对吧,就是为了去实现这个功能,我就把代码加到这了,对吧?啊,我们是这么来做的,但是我们使用了LP以后呢,我们就可以这么来做的,我可以明确的定义这个功能将来要应用到什么地方,或者说这个功能在哪里,比如说我就把这个功能定义到这个位置。而且。
04:53
我的定义这个功能要作用到什么地方对吧,比如说我要作用到哪个模块里面能明白吧,作用到哪个模块里面,以什么样的方式去作用,这些都是我可以明确的定义出来的,并且我们不必要修改,受影响的就是对于你要用日志的这个模块来讲,你里面是看不到任何日志代码的,就将来这个日志需求发生改变,这个家伙不需要做任何修改,你直接去改你的这个日志的这个什么切面就可以了。
05:23
明白了吧,所以说呢,这个这个地方就相当于什么呀,把我们相当于把我们以前写日志的那些东西呢,所有的日志相关的信息呢,都给它提取出来,你不要再写到人家的这个模块里面,对吧?都提取出来以后呢,把它形成一个单独的一个日志功能,对吧?就是我们的日志界面,然后呢,呃,我还可以定义将来我这个日志功能要作用到什么地方,对吧?比如说你哪些模块享用日志,OK,我可以给你作用上去,再一个呢,我可以定义我要通过什么样的方式去把我的这个日志功能给你做上去,这样的话呢,我们就更加灵活的可以把这个功能给它做出来了。
06:00
好吧,那这个我们也是先来简单介绍一下,呃,那么接下来我们先来再通过一个图来去给大家分析一下啊呃,这张图的话呢,我们可以啊,从上往下看,从上往上看是两种不同的效果,我们先来从上往下看,好听我讲这个东西呢,就是现在大家所看到的这个东西啊,你不要去看这些字是吧,听我讲这个你就把它想象成我们一开始写的那个日志功能,就是把那个日志的代码都写到那个加减乘除方法里面的,你来看一下加减乘除方法,在这个方法里面呢,我又又有什么各种日志的功能,又有什么验证的一些功能,都把它写到这个方法里面了,我们是不是分析过这样不好啊,对不对,OK,那么现在你看了哈,我可以在你的这个基础之上,我做一个什么事呢?我去抽取横切关注点,啥叫做横切关注点呢?就是验证参数,这就是一个横切关。
07:01
注点,在方法前记录日志,这也是一个横切关注点,在方法后记录日志,也是一个横切关注点,我把这些横切关注点呢,从你原本的ad方法中给你啊抽取出来能明白吧,就是不,不在你里面写了,我要把它拿出来了,拿出来以后呢,我们抽取出来的这个横切关注点,比如说验证参数的,我就可以把它抽取到一个切面中,那么就生成了一个验证切面,把这个日志相关的关注点呢,也给它抽取出来,我就形成了一个日志切面,就相当于什么呀,把这个所有日志相关的单独的定义到一个类中,而这个类就叫做一个切面。听明白这个意思了吗?所以说这张图从上往下看,我们叫做抽取横切关注点,那么抽取完了以后呢,我们生成的效果就是有一个验证,前面有一个日志前面,当然我们的业务逻辑就变成最开始的那个状态,就是特别干净,里面只有我们的加减乘除,没有任何日志啊,验证相关的东西了,这个大家能想到的吧。
08:16
能能想出来吧,你就想想,我把那里面的日志的代码都给他拿走了,是不是拿走以后呢,单独定义到某个地方了,那不就是我们的千面也有了,然后呢,这个原本的这个目标对象,是不是里面就是非常干净的这个业务逻辑了。对吧?OK,所以说呢,这个图从上往下看,我们叫做抽取横线关注点,好,那么当我们把这个结果抽取出来了以后,就是现在我已经成了这样的一种效果了,那么我们再从下往上看,现在的话,大家注意,像我们这一堆东西,它其实就是我们的目标对象,你想想是不是对不对,是目标对象吧,因为我我希望在你的加减乘除之上去加我的日志,加我的这个验证吗?那我通过代理的方式的话,你不就是一个目标对象了吗?对不对,然后呢,诶,我们现在呢,可以通过什么呀,通过代理的方式,或者说呢,通过我们support的AOPP这种方式,那么最终呢,我再把我的日志界面,验证界面,它里面的这些功能呢,再给你动态的作用到你这个目标对象上面,那么最终呢,就形成了这样的一种效果了,你看似你在写的时候就是一个很基本的加减乘除,但是最终我只要通过A。
09:31
P的方式,把你的这个所有的横切关注点,就是你这个切面里面的这个功能呢,给你动态的作用到这个目标对象上面,那么生成了就是这样的一种效果,也就意味着你很干净的加减乘除方法上面,我是可以作用我的日志的,但是呢,注意啊,不是把代码写进来了,而是动态的把这个地方的功能给你作用上去了,能明白这个意思吧,所以说呢,从下往上看,那么其实就是我们a op这样的一个过程。
10:05
能听明白了吗?Op做什么的呀?A op其实底层就是动态代理,你昨天做了那些事,我的a op就是来通过那种方式来去做的。好,所以说这个图大家必须要看得懂,从上往下,那就是抽取和这些关注点,就是我们昨天来去解决的这个问题,那么从下往上看呢,也是我们昨天已经通过动态代理啊去解决了那个问题,明白了吧,哎,叫做什么呀,我们只不过现在呢,我们可以啊使用spring的a op来去做这个事了,但是底层呢,它就是一个动态代理。能明白这个意思了吗?这个图能看懂了吗?差不多了吧,OK,好,来吧,那么解释了这么多啊,这就是我们a op它这个相关的一些概念,以及他的这个思想。啊,这里面的话,我们提到了非常重要的一个东西,就是我们的切面啊,其实我们对于AOPP来讲,主要的编程对象就是这个切面,你把切面会写了,那整个LP你就没有问任何问题了。
11:10
听到了吧。
我来说两句