什么是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

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

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

  1. 郫都区计算机老师周俊老师,教师节,带你走进郫都教师背后的故事

    点击"郫都教育"关注我们:) 有这样一群人 "师者,所以传道,授业,解惑也" 是他们奉献一生的事业 "随风潜入夜,润物细无声" 是他们培养英 ...

  2. 《C和C++程序员面试秘笈》——1.9 如何理解C++是面向对象化的,而C是面向过程化的...

    本节书摘来自异步社区出版社<C和C++程序员面试秘笈>一书中的第1章,第1.1节,作者: 董山海,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.9 如何理解 ...

  3. 鸿蒙面向开发者语言,华为正式发布鸿蒙OS 面向全球开发者开源!

    2019-08-09/16:03 驱动中国2019年8月9日消息  今日,2019华为开发者大会在广东东莞松山湖正式启幕.本届开发者大会以全场景和开发者为主题,涉及智能家居.智慧出行.可穿戴.EMUI ...

  4. 快手主播怎么引流?直播带货将面向多样化发展

    快手主播怎么引流?直播带货将面向多样化发展 "在疫情影响下,人们线上购物的习惯会被培养起来,直播带货将面向多样化发展.人们对于公益直播等新领域直播也在密切关注,直播内容更加多元.物流和货源充 ...

  5. 面向接口进行开发,而不是面向实现

    深入理解软件设计原则 第 7 篇 面向接口进行开发, 而不是面向实现: 依赖于抽象类 型, 而不是具体类. 如果无需修改已有代码就能轻松对类进行扩展, 那就可以说 这样的设计是灵活的.让我们再来看一个 ...

  6. 面向dba的linux shell 脚本简介,面向dba的linuxshell脚本简介.doc

    面向dba的linuxshell脚本简介.doc 面向DBA的LinuxShell脚本简介7年前,Oracle发布了Linux上的第一个商业数据库.从那时起,Oracle.RedHat和Novell/ ...

  7. 左室短轴切面_【图】短轴超声切面 - 心脏解剖学 - 天山医学院

    在标准左心室长轴切面基础上,将探头顺时针旋转90°,恰与左心室长轴垂直,可获得主动脉短轴切面(short axis section of aorta).沿该切面解剖心脏,中央为主动脉口横断面,可见主动 ...

  8. 你到国外去旅游,那里的人都讲英语,虽然你的英语不怎么好,但你会编程,请编写一段程序,利用文件“dict.txt”,把英文单词译成中文,帮助与人沟通。

    1.你到国外去旅游,那里的人都讲英语,虽然你的英语不怎么好,但你会编程,请编写一段程序,利用文件"dict.txt",把英文单词译成中文,帮助与人沟通. 文件dict.txt是一个 ...

  9. 带你理解面向过程与面向对象

    START WeChat Applet(公众号) :Java空巷 一.前言 如果你总是对面向对象和面向过程傻傻分不清,这篇博客尽量会用通俗的方式来讲解. 二.面向过程 概念 面向过程是一种以过程为中心 ...

最新文章

  1. 旷视科技 Face++ 全资收购艾瑞思机器人 正式进军机器人业务
  2. e7用什么主板_主板上这么多扩展插槽,都是干什么用的,看了不后悔
  3. 学习Zynq-7000的入门书单
  4. C++总结笔记(一)—— 基础知识汇总
  5. html div父集子集,抛砖引玉css系列---根据父元素包含的子元素个数,实现不同的样式...
  6. Kubernetes-DaemonSet(六)
  7. python字符串类型图解_Python基础——数据类型(图解+实例,非常详细!)
  8. 【转】VC动态内存分配PPT
  9. Java 9 正式发布,终落地 Jigsaw 项目
  10. 用javascript实现以下功能!_用python80行代码实现一个微信消息撤回捕捉功能
  11. spring+hibernate中clob、blob字段的处理方法
  12. Unix环境编程-守护进程
  13. cvDilate() 图像膨胀
  14. linux aria2 使用教程,Aria2安装配置使用教程
  15. 年度盘点 | 2019品牌营销围绕的三个关键词
  16. java通过poi生成excel并下载出现文件打不开、文件格式和文件扩展名无效问题的分析与解决
  17. 四种内容付费盈利模式介绍
  18. 企业选择局域网即时通讯软件的必要性是什么?
  19. 使用ZXing扫描多个二维码,条形码
  20. 黑马程序员_日记9_Java学习感言

热门文章

  1. 云计算之 PaaS详解
  2. 边缘计算与雾计算的区别
  3. jzxx1877烤面包
  4. 一键卸载lnmp环境
  5. [反汇编练习] 160个CrackMe之025
  6. Ubuntu 无损图片压缩
  7. 数据治理之数据标准管理
  8. 如何将tomcat部署到eclipse
  9. java-net-php-python-ssm宠物领养系统计算机毕业设计程序
  10. 如何在手机上使用脚本