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

什么是AOP

文章会同时发布在同名公众号《码可思》,一个适合学生党的公众号!
带你通俗易懂走进编程世界!面试

一、概念

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

说一下OOP

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

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

那么咱们要怎么理解面向对象编程呢?缓存

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

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

一、 本身买食材,而后煮饭,炒蛋,加上一切你想下的配料而后最后炒完出锅。框架

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

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

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

第二种的话,你不须要知道蛋炒饭具体是怎么作的,你只须要点餐而后最后就能吃到。若是你点完忽然不想吃了(在服务员没炒以前哈,否则老板可能觉得你搞事情,会把你轰出去!),想换成牛肉炒饭,此时你只须要跟老板说一声就能换了。而后若是你自己是第一种的话,你刚买的食材就废了。由于你只有鸡蛋,没有牛肉,可能一切就得从新来过!这就二者最明显的区别学习

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

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

因此如今来总结一下二者的优缺点:

面向对象:

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

面向过程:

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

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

二、切面要怎么理解?

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

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

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

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

先来讲一下咱们很熟悉的一个例子:

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

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

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

可是如今问题来了!

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

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

因此此时咱们的主角来了!AOP 面向切面的。

把这一到处须要用到这些共同方法地方都当作一个切面,而后把共同方法独立出来。再横切进去。

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

可是咱们还须要想到的一点就是,父类中也会有本身的一些动做(本身的业务代码),此时和这些子类的共同方法混杂在了一块儿,这个时候就会显色十分的臃肿!变得不易维护!

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

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

image-20200812153600925

上面这张图就可以很明显的看出来,这二者的不一样。在这个过程当中,须要保证的是,原来的业务代码不能被破坏掉!

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

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

五、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

最后但愿这篇文章可以帮助到你,若是文章中存在什么错误,请你们加以指正!

相关文章
相关标签/搜索