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)引入
不改代码的同时,为类动态地添加方法或字段。