细说Spring——AOP详解(AOP概览)

1、对AOP的初印象

首先先给出一段比较专业的术语(来自百度):web

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

而后咱们举一个比较容易理解的例子(来自:Spring 之 AOP):正则表达式

要理解切面编程,就须要先理解什么是切面。用刀把一个西瓜分红两瓣,切开的切口就是切面;炒菜,锅与炉子共同来完成炒菜,锅与炉子就是切面。web层级设计中,web层->网关层->服务层->数据层,每一层之间也是一个切面。编程中,对象与对象之间,方法与方法之间,模块与模块之间都是一个个切面。编程

咱们通常作活动的时候,通常对每个接口都会作活动的有效性校验(是否开始、是否结束等等)、以及这个接口是否是须要用户登陆。框架

按照正常的逻辑,咱们能够这么作。
这里写图片描述svg

这有个问题就是,有多少接口,就要多少次代码copy。对于一个“懒人”,这是不可容忍的。好,提出一个公共方法,每一个接口都来调用这个接口。这里有点切面的味道了。
这里写图片描述函数式编程

一样有个问题,我虽然不用每次都copy代码了,可是,每一个接口总得要调用这个方法吧。因而就有了切面的概念,我将方法注入到接口调用的某个地方(切点)。函数

这里写图片描述

这样接口只须要关心具体的业务,而不须要关注其余非该接口关注的逻辑或处理。
红框处,就是面向切面编程。设计

2、AOP中的相关概念

看过了上面的例子,我想你们脑中对AOP已经有了一个大体的雏形,可是又对上面提到的切面之类的术语有一些模糊的地方,接下来就来说解一下AOP中的相关概念,了解了AOP中的概念,才能真正的掌握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 和其余对象链接起来, 并建立 Adviced object 的过程

而后举一个容易理解的例子
看完了上面的理论部分知识, 我相信仍是会有很多朋友感受到 AOP 的概念仍是很模糊, 对 AOP 中的各类概念理解的还不是很透彻. 其实这很正常, 由于 AOP 中的概念是在是太多了, 我当时也是花了老大劲才梳理清楚的.
下面我以一个简单的例子来比喻一下 AOP 中 Aspect, Joint point, PointcutAdvice之间的关系.
让咱们来假设一下, 从前有一个叫爪哇的小县城, 在一个月黑风高的晚上, 这个县城中发生了命案. 做案的凶手十分狡猾, 现场没有留下什么有价值的线索. 不过万幸的是, 刚从隔壁回来的老王刚好在这时候无心中发现了凶手行凶的过程, 可是因为天色已晚, 加上凶手蒙着面, 老王并无看清凶手的面目, 只知道凶手是个男性, 身高约七尺五寸. 爪哇县的县令根据老王的描述, 对守门的士兵下命令说: 凡是发现有身高七尺五寸的男性, 都要抓过来审问. 士兵固然不敢违背县令的命令, 只好把进出城的全部符合条件的人都抓了起来.code

来让咱们看一下上面的一个小故事和 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.

最后是一个描述这些概念之间关系的图
这里写图片描述

3、其余的一些内容

AOP中的Joinpoint能够有多种类型:构造方法调用,字段的设置和获取,方法的调用,方法的执行,异常的处理执行,类的初始化。也就是说在AOP的概念中咱们能够在上面的这些Joinpoint上织入咱们自定义的Advice,可是在Spring中却没有实现上面全部的joinpoint,确切的说,Spring只支持方法执行类型的Joinpoint

Advice 的类型

  • before advice, 在 join point 前被执行的 advice. 虽然 before advice 是在 join point 前被执行, 可是它并不可以阻止 join point 的执行, 除非发生了异常(即咱们在 before advice 代码中, 不能人为地决定是否继续执行 join point 中的代码)

  • after return advice, 在一个 join point 正常返回后执行的 advice

  • after throwing advice, 当一个 join point 抛出异常后执行的 advice
  • after(final) advice, 不管一个 join point 是正常退出仍是发生了异常, 都会被执行的 advice.
  • around advice, 在 join point 前和 joint point 退出后都执行的 advice. 这个是最经常使用的 advice.
  • introduction,introduction能够为原有的对象增长新的属性和方法。

Spring中,经过动态代理和动态字节码技术实现了AOP,这些内容,咱们将在之后进行讲解。