Spring AOP的8个关键术语:连接点、切点,增强目标等

概念AOP是“面向方面编程” , 要解决的问题是 , 把重复性的横切逻辑独立出来 , 然后融合到业务逻辑中 , 达到和原来一样的业务流程;
AOP的工作重心在于如何将增强应用于目标对象的连接点上 。 这里包括两项工作:

  • 第一、如何通过切点和增强定位到连接点上:
  • 第二、如何在增强中编写切面的代码 。
1、连接点
是程序执行的某个特定位置 , 如类开始初始化前、类初始化后、类的某个方法调用前/调用后、方法抛出异常后 。
一个类或一段程序代码拥有一些具有边界性质的特定点 , 这些代码中的特定点就被称为“连接点” 。
连接点由两个信息确定:
  • 一是用方法表示的程序执行点;
  • 二是用相对位置表示的方位;
2、切点
每个程序类都拥有多个连接点,如一个拥有两个方法的类 , 这两个方法都是连接点 ,
即连接点是程序类中客观存在的事物 。
但在为数众多的连接点中 , 如何定位某些感兴趣的连接点呢? AOP 通过“切点”定位特定的接连点 。
用数据库查询的概念来理解切点和连接点的关系再合适不过了:连接点相当于数据库中的记录 , 而切点相当于查询条件 。
切点和连接点不是一对一的关系 , 一个切点可以匹配多个连接点 。
在Spring中 , 切点通过org.springframework.aop.Pointcut 接口进行描述 , 它使用类和方法作为连接点的查询条件,SpringAOP的规则解析引擎负责解析切点所设定的查询条件 , 找到对应的连接点 。
确切地说 , 应该是执行点而非连接点 , 因为连接点是方法执行前、执行后等包括方位信息的具体程序执行点 , 而切点只定位到某个方法上 , 所以如果希望定位到具体的连接点上 , 还需要提供方位信息 。
3、增强(Advice)
增强是织入目标类连接点上的一段程序代码 , 在Spring中 , 增强除用于描述一段程序代码外 ,还拥有另一个和连接点相关的信息 , 这便是执行点的方位 。 结合执行点的方位信息和切点信息 , 就可以找到特定的连接 。
正因为增强既包含用于添加到目标连接点上的一段执行逻辑 ,又包含用于定位连接点的方位信息 , 所以Spring 所提供的增强接口都是带方位名的 , 如BeforeAdvice 、AfterReturningAdvice、ThrowsAdvice 等 。
BeforeAdvice 表示方法调用前的位置 , 而AferRetunningAdvice表示访问返回后的位置 。 所以只有结合切点和增强 , 才能确定特定的连接点并实施增强逻辑 。
4、目标对象(Target)
目标对象可以理解为业务逻辑 , 增强逻辑的织入目标类 , 如果没有AOP , 那么业务逻辑需要完成业务逻辑+所有非横切逻辑;
5、引介(Introduction)
引介是一种特殊的增强 , 它为类添加一些属性和方法 。 这样 , 即使一个业务类原本没有实现某个接口 , 通过AOP的引介功能 , 也可以动态地为该业务类添加接口的实现逻辑 , 让业务类成为这个接口的实现类 。
6、织入(Weaving)
【Spring AOP的8个关键术语:连接点、切点,增强目标等】织入是将增强添加到目标类的具体连接点上的过程 。 AOP就像一- 台织布机 , 将目标类、增强或者引介天衣无缝地编织到- -起 。 我们不能不说“织入”这个词太精辟了 。
根据不同的实现技术 , AOP有3种织入方式:
  • (1)编译期织入 , 这要求使用特殊的Java编译器 。
  • (2)类装载期织入 , 这要求使用特殊的类装载器 。
  • (3)动态代理织入 , 在运行期为目标类添加增强生成子类的方式 。
Spring采用动态代理织入 , 而AspectJ采用编译期织入和类装载期织入 。
7、代理(Proxy)
一个类被AOP织入增强后 , 就产生了一个结果类 , 它是融合了原类和增强逻辑的代理类 。
根据不同的代理方式 , 代理类既可能是和原类具有相同接口的类 , 也可能就是原类的子类 , 所以可以采用与调用原类相同的方式调用代理类 。


推荐阅读