1. 写在前面
在之前的学习中,我们对 IOC 相关的内容进行了学习。知道了 IoC 是为了达到解耦合,将Bean之间的控制权交出给第三方的 IoC 容器;也学习了相关的 IoC 高级用法。
下面我们一起看一下,Spring 中另外一个比较重要的概念—AOP(Aspect Oriented Programming,面向切面编程)。
2. 几个概念
2.1 为什么要有 AOP
这里直接看几张图就可以说明问题:
两个有类似功能的类
其实,如果这里将“检测活动有效性”“检测活动xxx”抽取出来,作为公共方法去引入,也是可以的。
但是,为了方便起见,我们并不愿意这么做。而是做了一个切面。
AOP切面
这样一来,只需要在需要使用的地方直接注入即可。
这就是AOP最原始的出发点。
2.2 AOP 相关概念
2.2.1 专业概念
首先,在AOP这里有一些专业的概念定义:
-
Aspect / 切面
: 就是最终被织入的整个功能(代码块) -
Joint Point / 连接点
: 定义在程序流程中何处插入切面的执行点 -
Pointcut / 切点
: 特定连接点的集合 -
Advice / 增强
: Pointcut 上执行的动作 -
Target / 目标对象
: 被waving 的对象 -
Interceptor / 拦截器
: 实现 advice 的一种方式 -
Waving / 织入
: 将整个 aspect 整合到程序的 JointPoint 处
2.2.2 举一个栗子
这里我们可以通过一个例子来生动的理解这些概念:
夜黑风高杀人夜,在一个叫做 爪哇 的县城发生了一起命案。目击者称,凶手是个男性,身高1.75米。公安局长根据目击者的证词,对所有公安下令:将所有身高1.75米的男性都抓过来审问。公安根据命令,将所有符合条件的人都抓了起来。
将上述的概念和这个例子对应起来:
-
Joint Point
: 就是县城里所有的人。 -
Pointcut
: 特定的 JointPoint。就是1.75的男人
。 -
Advice
: pointcut 上执行的动作。就是抓起来审问
。 -
Aspect
: pointcut + advice。 就是1.75的男人抓起来审问
。
这里有一个示意图,需要理解一下:
AOP概念
2.2.3 其他概念
Spring 中支持的 JointPoint类型
理论上来说,AOP 中 支持的 JointPoint 的类型有多种:构造方法调用、字段设置和获取(get/set)、方法调用、方法执行、异常处理、类的初始化 等等。
但是,在 Spring 中,只支持 方法执行 类型的 JointPoint
Advice 类型
-
before advice
: 在 jointpoint 之前执行的 advice。该 advice 代码中无法人为规定是否执行 jointpoint中的代码。 -
after return advice
: jointpoint 正常执行返回之后执行的advice。 -
after throwing advice
: jointpoint 跑出异常执行的 -
after (final) advice
: 正常/异常,都执行 -
around advice
: 在 jointpoint 执行前/后 都执行的 advice。最常用的 advice。 -
introduction
: 为原有对象增加新的属性和方法。
网友评论