什么是AOP

1、概念

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

说一下OOP

有一天面试官问你什么是OOP?

然后你可能会一脸懵逼的说OOP?what?这是什么玩意!其实它就是你一直学的面向对象编程(Object Oriented Programming),

那么我们要怎么理解面向对象编程呢?

我们都知道面向对象编程之前还有一个面向过程编程。我们学习编程的基础C语言就是面向过程的编程。要怎么具体理解这两者的区别呢?

举个简单的例子。当你要吃一份蛋炒饭的时候,你该怎么办,下面给你两个选择!

1、 自己买食材,然后煮饭,炒蛋,加上一切你想下的配料然后最后炒完出锅。

2、你去某某某大酒店,坐下大喊:“服务员!来一份蛋炒饭”(应该不会被打死吧,就点一份蛋炒饭)

看出来区别了嘛!其实说到这里应该都有感觉了,1就是面向过程的,2就是面向对象的!

那么这两种编程方式到底有什么区别呢?

第二种的话,你不需要知道蛋炒饭具体是怎么做的,你只需要点餐然后最后就能吃到。如果你点完突然不想吃了(在服务员没炒之前哈,不然老板可能以为你搞事情,会把你轰出去!),想换成牛肉炒饭,此时你只需要跟老板说一声就能换了。然后如果你本身是第一种的话,你刚买的食材就废了。因为你只有鸡蛋,没有牛肉,可能一切就得重新来过!这就两者最明显的区别

面向过程是一步一步分析,一步一步实现的,

面向对象是模型化的,我们只需要抽象出一个类就行,封装起来,然后要用的时候直接调用。至于具体里面怎么实现的(就是蛋炒饭怎么抄的完全不关我们的事情,我们只需要吃就行了!)

所以现在来总结一下两者的优缺点:

面向对象:

  • 优点:易维护、易复用、易扩展
  • 缺点:性能比较差,因为类调用时需要实例化,开销比较大,比较消耗资源

面向过程:

  • 优点:性能好
  • 缺点:不易维护、不易复用、不易扩展

然后下面回到我们今天的主题,AOP面向切面编程!是在我们的 OOP的基础上提出来的!

2、切面要怎么理解?

AOP是面向切面编程,那么这个切面到底是指什么呢?

其实很容易理解,一个完整的西瓜,我们拿一把刀沿着中间切下去,此时我们就得到了两个切面。

在编程中,对象与对象之间,方法与方法之间,模块与模块之间都是一个个切面

3、那么面向切面有什么用呢?

先来说一下我们很熟悉的一个例子:

例如:现在有一个 Dog类 和 Cat类,它们都有共同的方法,它们都能跑 run(),都能吃 eat()。

在我们 OOP中,此时就会写一个 Animal类,这个类有了 Dog类和 Cat类*同的方法。run() 和 eat()

这样的话我们就只需要在实现 Dog和Cat 的时候,去继承 Animal类即可!这样确实减少了我们重复代码的书写。

但是现在问题来了!

如果此时在我们的父类中多个方法的相同位置中,出现了很多重复的代码!此时应该怎么办?还有的是,Java只提供单继承,不能继承其它父类。

OOP 是一个纵向的的体系,从上到下的。

所以此时我们的主角来了!AOP 面向切面的。

把这一处处需要用到这些共同方法地方都看成一个切面,然后把共同方法独立出来。再横切进去。

可能有人会想说,我们父类中,不就是把子类*同的方法提出来了嘛?那么这不是一样的吗?

但是我们还需要想到的一点就是,父类中也会有自己的一些动作(自己的业务代码),此时和这些子类的共同方法混杂在了一起,这个时候就会显色十分的臃肿!变得不易维护!

AOP就是用来解决这些问题的!

AOP 将我们这些所谓的需要横切的代码单独提取出来,和原来的业务代码进行了分离。

都知道面向对象了,那么面向切面呢!通俗易懂带你走进面向切面编程!

上面这张图就能够很明显的看出来,这两者的不同。在这个过程中,需要保证的是,原来的业务代码不能被破坏掉!

4、AOP 解决了什么问题呢?

通过上面的分析可以发现,AOP 主要用来解决:在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。

5、AOP 中的相关概念

学习了Spring的同学可能就知道,在Spring中,有两个很重要的东西,一个是 IOC , 另外一个就是AOP了,IOC在我的上一篇文章就已经带着大家理解了一遍了,没看的同学们可以查看历史消息。在Spring中,AOP有很多专业的概念,以下为大家列了出来:

  • Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
  • Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
  • Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
  • Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
  • Target(目标对象):织入 Advice 的目标对象.。
  • Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Advice的 object 的过程

然后最后举一个例子,例子是在CSDN上面看到的,非常的形象!文字有点多,但是还是希望大家把它看完,看完后真的受益匪浅

让我们来假设一下, 从前有一个叫爪哇的小县城, 在一个月黑风高的晚上, 这个县城中发生了命案. 作案的凶手十分狡猾, 现场没有留下什么有价值的线索. 不过万幸的是, 刚从隔壁回来的老王恰好在这时候无意中发现了凶手行凶的过程, 但是由于天色已晚, 加上凶手蒙着面, 老王并没有看清凶手的面目, 只知道凶手是个男性, 身高约七尺五寸. 爪哇县的县令根据老王的描述, 对守门的士兵下命令说: 凡是发现有身高七尺五寸的男性, 都要抓过来审问. 士兵当然不敢违背县令的命令, 只好把进出城的所有符合条件的人都抓了起来.

小故事和 AOP 到底有什么对应关系?

首先我们知道, 在 Spring AOP 中 Joint point 指代的是所有方法的执行点, 而 point cut 是一个描述信息, 它修饰的是 Joint point, 通过 point cut, 我们就可以确定哪些 Joint point 可以被织入 Advice. 对应到我们在上面举的例子, 我们可以做一个简单的类比, Joint point 就相当于 爪哇的小县城里的百姓,pointcut 就相当于 老王所做的指控, 即凶手是个男性, 身高约七尺五寸, Advice 则是施加在符合老王所描述的嫌疑人的动作: 抓过来审问.
为什么可以这样类比呢?

  • Joint point : 爪哇的小县城里的百姓: 因为根据定义, Joint point 是所有可能被织入 Advice 的候选的点, 在 Spring AOP中, 则可以认为所有方法执行点都是 Joint point. 而在我们上面的例子中, 命案发生在小县城中, 按理说在此县城中的所有人都有可能是嫌疑人.
  • Pointcut :男性, 身高约七尺五寸: 我们知道, 所有的方法(joint point) 都可以织入 Advice, 但是我们并不希望在所有方法上都织入 Advice, 而 Pointcut 的作用就是提供一组规则来匹配joinpoint, 给满足规则的 joinpoint 添加 Advice. 同理, 对于县令来说, 他再昏庸, 也知道不能把县城中的所有百姓都抓起来审问, 而是根据凶手是个男性, 身高约七尺五寸, 把符合条件的人抓起来. 在这里 凶手是个男性, 身高约七尺五寸 就是一个修饰谓语, 它限定了凶手的范围, 满足此修饰规则的百姓都是嫌疑人, 都需要抓起来审问.
  • Advice :抓过来审问, Advice 是一个动作, 即一段 Java 代码, 这段 Java 代码是作用于 point cut 所限定的那些 Joint point 上的. 同理, 对比到我们的例子中, 抓过来审问 这个动作就是对作用于那些满足 男性, 身高约七尺五寸 的爪哇的小县城里的百姓.
  • Aspect::Aspect 是 point cut 与 Advice 的组合, 因此在这里我们就可以类比: “根据老王的线索, 凡是发现有身高七尺五寸的男性, 都要抓过来审问” 这一整个动作可以被认为是一个 Aspect.

所以这个小故事其实很好的向我们展示了彼此之间的关系!

能够看到这里的同学,我觉得毅力是相当的好的!因为这篇文章基本全身理论性的东西,阿蓝在书写和规划的过程也是有想到写出来会十分的枯燥!但是没办法,我们看完了能够掌握到它的精髓,这就很足够了!

最后补充一下AOP的应用场景

Authentication 权限

Caching 缓存

Context passing 内容传递

Error handling 错误处理

Lazy loading 懒加载

Debugging  调试

logging, tracing, profiling and monitoring 记录跟踪 优化 校准

Performance optimization 性能优化

Persistence  持久化

Resource pooling 资源池

Synchronization 同步

Transactions 事务

END

最后希望这篇文章能够帮助到你,如果文章中存在什么错误,请大家加以指正!

分类:

技术点:

相关文章: