Spring -- AOP

AOP 的核心实现原理:动态代理

AOP 术语

1. 连接点(JoinPoint)

特定点是程序执行的某个特定位置,如类开始初始化前、类初始化后、类的某个方法调用前/调用后方法抛出异常后。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就被称为”连接点“。Spring 仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时及方法调用前后这些程序执行点织入增强。

连接点由两个信息确定:一是用方法表示的程序执行点;二是用相对位置表示的方位。如在 Test.foo() 方法执行前的连接点,执行点为 Test.foo(),方位为该方法执行前的位置。

2. 切点(Pointcut)

每个程序类拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物。但在位数众多的连接点中,如何定位某些感兴趣的连接点呢?AOP 通过”切点“定位特定的连接点。借助数据库查询的概念来理解切点和连接点的关系再合适不过了:连接点相当于数据库中的记录,而切点相当于查询条件。切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。

在 Spring 中,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件,Spring AOP 的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。确切地说,应该是执行点而非连接点,因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点,而切点只定位到某个方法上,所以如果希望定位到具体的连接点上,还需要提供方位信息。

3. 增强(Advice)

增强是织入目标类连接点上的一段程序代码。在 Spring 中,增强除用于描述一段程序代码外,还拥有另一个和连接点相关的信息,这便是执行点的方位。结合执行点的方位信息和切点信息,就可以找到特定的连接。正因为增强既包含用于添加到目标连接点上的一段逻辑,又包含用于定位连接点的方位信息,所以 Spring 所提供的增强接口都是带方位名的,如 BeforeAdvice、AfterReturningAdvice、ThrowsAdvice 等。BeforeAdvice 表示方法调用前的位置,而 AfterReturningAdvice 表示访问放回后的位置。所以只有结合切点和增强,才能确定特定的连接点并实施增强逻辑。

4. 目标对象(Target)

增强逻辑的织入目标类。如果没有 AOP,那么目标业务类需要自己实现所有的逻辑。在 AOP 的帮助下,业务类只实现那些非横切逻辑的程序逻辑,而性能监视和事务管理等这些横切逻辑则可以使用 AOP 动态织入特定的连接点上。

5. 引介(Introduction)

引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过 AOP 的引介功能,也可以动态地为该业务类添加接口的而实现逻辑,让业务类成为这个接口的实现。

6. 织入(Weaving)

织入是将增强添加到目标类的具体连接点上的过程。AOP 就像一台织布机,将目标类、增强或者引介天衣无缝地编织到一起。根据不同的实现技术,AOP 有 3 种植入方式。

  • 编译期织入,这要求使用特殊的 Java 编译器。
  • 类装载期织入,这要求使用特殊的类装载器。
  • 动态代理织入,在运行期间为目标类添加增强生成子类的方式。

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

7. 代理(Proxy)

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

8. 切面(Aspect)

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

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

你可能感兴趣的:(Spring,Java,Java,Web,spring,aop)