前言:AOP,也就是面向切面编程,作为面向切面编程的一种补充,已经比较成熟,如果是OOP是从静态角度考虑程序结构,那么AOP则是从动态角度考虑程序运行。本文旨在介绍Spring对AOP的支持,简述其用法。
本篇文章重点关注以下问题:
- AOP的使用场景
- AOP的基本概念
- Spring对AOP的支持
1. AOP的使用场景
AOP 广泛应用于处理一些具有横切性质的系统级服务,何为横切性质?可以把它理解为各业务流程共有的模块,如下图所示:
日志服务、安全服务就属于横切性质的系统级服务,此服务为各业务流程都需要的服务。常规以OOP方式讲,需要实现上图的功能,各业务流程需要三段完全相似的方法段,如下图所示:
很明显,此方法较low,若果哪天需要切换安全策略,或是修改日志记录细节,就需要维护多处代码(成千上百处),这是非常令人沮丧的事。AOP就是为弥补OOP处理这些问题而生的,如下图所示:
通过抽象分析出各模块、各方法的交叉关注点,将其抽离出来在一处处理,这种方式无疑非常优雅,维护起来也很方便。
2. AOP基本概念
AOP从程序运行角度考虑程序的流程,提取业务处理过程的切面。Aop面向的是程序运行中的各个步骤,希望以更好的方式来组合业务处理的各个步骤。先来简单介绍下关于面向切面编程的一些术语:
- 切面(Aspect):切面用于组织多个Advice,Advice放在切面中定义;
- 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或异常的抛出。在SpringAOP中,连接点总是方法的调用;
- 增强处理(Advice):AOP框架在特定的切入点执行的增强处理。如“around”、“before”等
- 切入点(Pointcut):可以插入增加处理的连接点。简言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。
- 引入:将方法或字段添加到被处理的类中。(比如,可以使用一个引入,是任何对象实现isModified接口)
- 目标对象:被AOP框架进行增强处理的对象,也被称为被增强对象。
- AOP代理:AOP框架创建的对象,简单的说,代理就是对目标对象的加强。
- 织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程。
总结AOP的任务:AOP框架动态生成一个AOP代理对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但AOP代理中的方法与目标对象的方法存在差异——AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法。运行原理如下图所示: