您的位置:首页 > 编程语言 > Java开发

Spring AOP基础

2015-10-27 15:46 155 查看

Spring AOP基础

AOP 术语

连接点(Joinpoint)

程序执行的某个特定位置:如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。

一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为“连接点”。

Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出一场时以及方法调用前后这些程序执行点织入增强。

连接点由两个信息确定:第一是用方法表示的程序执行点;第二使用相对点表示的方位。

如在Test.foo()方法执行前的连接点,执行点为Test.foo(),方位为该方法执行前的位置。

Spring使用切点对执行点进行定位,而方位则在增强类型中定义。

切点(Pointcut)

每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。但在这为数众多的连接点中,如何定位到某个感兴趣的连接点上呢?AOP通过“切点”定位特定的连接点。

增强(Advice)

增强是织入到目标类连接点上的一段程序代码。

在Spring中,增强除了用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。

结合执行点方位信息和切点信息,就可以找到特定的链接点了。

正因为增强即包含了用于添加到目标连接点上的一段执行逻辑,又包含了用于定位连接点的方位信息,所以Spring所提供的增强接口都是带方位名的:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。

所以只有结合切点和增强两者一起上阵才能确定特定的连接点并实施增强逻辑。

目标对象(Target)

增强逻辑的织入目标类。

引介(Introduction)

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

这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,我们可以动态地为该业务类添加接口的实现逻辑,让业务类成为这个接口的实现类。

织入(Weaving)

织入是将增强添加到目标类具体连接点上的过程,AOP像是一台织布机,将目标类、增强或者引介通过AOP这台织布机天衣无缝地编制到一起。

AOP有三种织入的方式:

编译期织入,这要求使用特殊的Java编译器

类装载期织入,这要求使用特殊的类加载器

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

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

代理(Proxy)

一个类被AOP织入增强后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类。

切面(Aspect)

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

AOP的工作重心在于如何将增强应用于目标对象的连接点上,这里首先包括两个工作:第一,如何通过切点和增强定位到连接点上;第二,如何在增强中编写切面的代码。

增强类型

前置增强:在目标方法执行前实施增强

后置增强:在目标方法执行后实施增强

环绕增强:在目标方法执行前后实施增强

异常抛出增强:在目标方法抛出异常后实施增强

引介增强:在目标类中添加一些新的方法和属性

切点类型

spring提供了六种类型切点

静态方法切点: 默认情况下匹配所有的类

动态方法切点:已过时

注解切点:支持在Bean中直接通过jdk5.0注解标签定义的切点

表达式切点:支持AspectJ切点表达式语言

流程切点:控制流程切点

复合切点:为创建多个切点而提供的方便操作类。

切面类型

切面可以分为三类:一般切面、切点切面和引介切面

Advisor

代表一般切面,它仅包含一个Advice。我们说过,因为Advice包含了横切代码和连接点的信息,所以Advice本身就是一个简单的切面,只不过它代表的横切的连接点是所有目标类的所有方法,因为这个横切面太宽泛,所以一般不会直接使用

PointCutAdvisor

代表具有切点的切面,它包含Advice和Pointcut两个类,这样,我们就可以通过类、方法名及方法方位等信息灵活地定义切面的连接点,提供更具适用性的切面

IntroductionAdivsor

代表引介切面。引介切面是对应引介增强的特殊的切面,它应用于类层面上,随意引介切点使用ClassFilter进行定义。

参考文献

[1]:Spring 3.X企业应用开发实践
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: