『编程基础』AOP-面向切面编程

概述

AOP(Aspect-oriented Programming,面向切面编程)是计算机科学中的一个术语,指一种程序设计范型。该范型以一种称为侧面(Aspect,又译作方面)的语言构造为基础,侧面是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点(crosscutting concern)。
侧面的概念源于对面向对象程序设计的改进,但并不只限于此,它还可以用来改进传统的函数。与侧面相关的编程概念还包括元对象协议、主题、混入和委托。
Aspect的确是“方面”的意思。不过,汉语传统语义中的“方面”,大多数情况下指的是一件事情的不同维度、或者说不同角度上的特性,比如我们常说:“这件事情要从几个方面来看待”,往往意思是:需要从不同的角度来看待同一个事物。这里的“方面”,指的是事物的外在特性在不同观察角度下的体现。而在AOP中,Aspect的含义,可能更多的理解为“切面”比较合适。
在软件业,AOP通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。
在Spring中提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

编程思想

AOP是面向切面的编程,其编程思想是把散布于不同业务但功能相同的代码从业务逻辑中抽取出来,封装成独立的模块,这些独立的模块被称为切面,切面的具体功能方法被称为关注点。在业务逻辑执行过程中,AOP会把分离出来的切面和关注点动态切入到业务流程中,这样做的好处是提高了功能代码的重用性和可维护性。

AOP&OOP

AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP面向对象编程针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。
而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。
举例说明,对于“员工”这样一个业务实体进行封装,自然是OOP/OOD的任务,我们可以为其建立一个“Staff”类,并将“员工”相关的属性和行为封装其中。而用AOP设计思想对“员工”进行封装将无从谈起。
同样,对于“权限检查”这一动作片断进行划分,则是AOP的目标领域。而通过OOD/OOP对一个动作进行封装,则有点不伦不类。
换而言之,OOD/OOP面向名词领域,AOP面向动词领域。

应用场景

将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

术语

Aspect(切面)

切入业务流程的一个独立模块。一个应用程序可以拥有任意数量的切面。

Join point(连接点)

也就是业务流程在运行过程中需要插入切面的具体位置。

Advice(通知)

是切面的具体实现方法。可分为前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)和环绕通知(Around)五种。实现方法具体属于哪类通知,是在配置文件和注解中指定的。
前置通知,后置通知,返回通知,异常通知:都可以接受一个JoinPoint类型的对象作为参数。该对象封装了连接点的相关信息。主要关注:方法参数和方法签名。
返回通知的returning属性可以将目标方法的返回值定义一个名字,然后在返回通知的形参上声明一个同名的Object类型的参数,来访问方法的返回结果。
环绕通知:环绕通知必须要有返回值;环绕通知必须要有形参;在环绕通知中,显示调用目标对象的切点并将结果返回出去。

Pointcut(切入点)

用于定义通知应该切入到哪些连接点上,不同的通知通常需要切入到不同的连接点上。

Target(目标对象)

被一个或者多个切面所通知的对象。

Proxy(代理对象)

将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象为目标对象的业务逻辑功能加上被切入的切面所形成的对象。

Weaving(切入/织入)

将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期。

实现步骤

具体实现步骤是:首先编写需要切入业务流程的独立模块(也称为切面)和切入点(模块中的方法);然后在配置文件中配置AOP,添加切入面、切入点以及需要切入的目标;最后编写测试代码。

你可能感兴趣的:(『编程基础』AOP-面向切面编程)