一.什么是 AOP

AOP 是 Aspect  Oriented  Programing 的简称.  也称为 面向切面编程.

图解说明一下AOP:

Spring AOP 概述-LMLPHP

上图中的业务逻辑代码淹没在重复化非业务逻辑代码中 (监控和事务代码).  无法通过抽象父类的方式消除重复性横切代码,  因为这些横切逻辑依附在业务逻辑中,  不能转移到其他地方.

AOP 将这些分散在各个业务逻辑代码中的相同代码通过横向切割的方式抽取到一个独立的模块中,  其实 AOP主要解决的问题是, 如何将这些独立的逻辑模块融合到业务逻辑中,  以形成完整的业务流程.

AOP通过横向抽取机制为这些类无法通过纵向继承体系进行抽象的重复代码提供了解决方案.

二.AOP术语

1.连接点 (JoinPoint)

特定点是程序执行的某个特定位置,  如类开始初始化前,  类初始化后,  类的某个方法调用前/调用后,  方法抛出异常后.  一个类或一段程序代码拥有一些具有边界性质的特定点,  这些特定点就叫做连接点. 

连接点由两个信息确定: 一是用方法表示的程序执行点.  二是用相对位置表示的方位.  如在 test.do() 方法执行前的连接点, 执行点为 test.do();  方位为该方法执行前的位置.  Spring使用切点对执行点进行定位,  而方位则在增强类型中进行定义.

2.切点  (Pointcut)

Spring 通过切点定位特定的连接点.  一个切点可以匹配多个连接点.

3.增强  (Advice)

增强是织入目标类连接点上的一段程序代码.  增强除了用于描述一段程序代码外,  还拥有另一个和连接点相关的信息,  便是执行点的方位.  结合执行点的方位信息和切点信息就可以找到特定的连接.  

因为增强既包含用于添加到目标连接点上的一段执行逻辑,  又包含用于定位连接点的方位信息,  所以 Spring 所提供的增强接口都是带方位名的,  如 BeforeAdvice, ThrowsAdvice等.  只有结合切点和增强才能确定特定的连接点并实施增强逻辑.

4.目标对象  (Target)

增强逻辑的织入目标类.  

5.引介  (Introduction)

引介是一种特殊的增强,  它为类添加一些属性和方法.

6.织入  (Weaving)

织入是将增强添加到目标类的具体连接点上的过程.  AOP有3种织入方式:

(1)编译器织入.  要求使用特殊的Java编译器.

(2)类装载期织入.  要求使用特殊的类装载器.

(3)动态代理织入.  在运行期为目标类添加增强生成子类的方式.

Spring 采用动态代理织入,  而 AspectJ 采用编译期织入和类装载期织入.

7.代理  (Proxy)

一个类被AOP织入增强后,  就产生了一个结果类.  它是融合了原类和增强逻辑的代理类.  根据不同的代理方式,  代理类既可能是和原类具有相同接口的类,  也可能就是原类的子类.  可以采用与调用原类相同的方式调用代理类.

8.切面  (Aspect)

切面由切点和增强(引介)组成.  它既包括横切逻辑的定义,  也包括连接点的定义.  Spring AOP就是负责实施切面的框架,  它将切面所定义的横切逻辑织入切面所指定的连接点中.

三. AOP的实现者

1. AspectJ

AspectJ是语言级的AOP实现,  AspectJ扩展了Java语言,  定义了AOP语法.  能够在编译器提供横切代码的织入.  有一个专门的编译器用来生成遵守Java字节编码规范的Class文件.

2.  Spring  AOP

Spring AOP使用纯Java实现,  不需要专门的编译过程,  也不需要特殊的类装载器,  它在运行期通过代理方式向目标类织入增强代码

 

10-07 18:30