Spring快速入门
上QQ阅读APP看书,第一时间看更新

4.1 AOP基础

在第2章中也有介绍AOP,不过侧重点是AOP的原理和动态代理,本节主要介绍AOP的基础知识点。

4.1.1 AOP的引入

这里可以把单个模块当作一个圆柱,假如没有AOP,那么在做日志处理的时候,我们就会在每个模块中添加日志或者权限处理,日志或权限类似圆柱体的部分圆柱,如图4-1所示。

图4-1

一般大多数的日志或权限处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法,如图4-2所示。

图4-2

即使这样,我们仍然必须手动插入这些方法,而且这两个方法是强耦合的。假如此时我们不需要这个功能了,或者想换成其他功能,就必须一个个修改。

通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来,形成一个独立的模块,然后在指定位置插入这些功能。这样的思想被称为面向切面编程,亦即AOP,如图4-3所示。

图4-3

4.1.2 AOP主要概念

4.1.1小节介绍了引入AOP的好处,本小节来了解一下AOP的几个核心概念。

(1)横切关注点

AOP把一个业务流程分成几部分,例如权限检查、业务处理、日志记录,每个部分单独处理,然后把它们组装成完整的业务流,每部分被称为切面或关注点。

(2)切面

类是对物体特征的抽象,切面就是对横切关注点的抽象。可以将每部分抽象成一叠纸一样,一层一层的,那么每张纸都是一个切面。

(3)连接点

因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。其实,Spring只支持方法类型的连接点包含字段和构造器。因为字段通过get、set方法得到,构造器其实也是方法。Spring只支持方法类型的连接点和连接点是字段或者构造器是包含关系。

(4)切入点

对连接点进行拦截的定义。连接点可以有很多,但并不一定每个连接点都进行操作,比如莲藕,藕段与藕段之间是有连接点的,但不一定都切开。

(5)通知

通知指的就是指拦截到连接点之后要执行的代码,分为前置、后置、异常、最终、环绕通知5类。这个有点类似于把藕段与藕段断开之后要做的事情,是往里面加蜂蜜还是做什么。

(6)目标对象

代理的目标对象,就是动态代理的target,在实际操作中一般会先实现AOP的接口,然后配置这些接口作用到哪些对象上,被作用的对象就是目标对象。

(7)织入

切面是独立的,目标对象也是独立的,它们是不耦合的,那它怎么把切面放到目标对象中呢?这时就需要进行织入操作,就类似这种的,怎么把target和打印日志联系到一起呢?使用动态代理。在Spring中,aop.framework.ProxyFactory用作织入器,进行横切逻辑的织入。

(8)引入

不改代码的同时,为类动态地添加方法或字段。