AOP

Spring通过使用基于模式的方法或@AspectJ批注样式,提供了编写自定义方面的简单而强大的方法.

AOP在Spring Framework中用于:

  • 提供声明式企业服务. 此类服务最重要的是声明式事务管理 .
  • 让用户实现自定义方面,以AOP补充其对OOP的使用.

术语

  • 方面(Aspect):涉及多个类别的关注点的模块化. 事务管理是企业Java应用程序中横切关注的一个很好的例子. 在Spring AOP中,方面是通过使用常规类( 基于模式的方法 )或使用@Aspect注释( @AspectJ样式 )注释的常规类来实现的.
  • 连接点(Join point):在程序执行过程中的一点,例如方法的执行或异常的处理. 在Spring AOP中,连接点始终代表方法的执行.
  • 增强(Advice):方面在特定的连接点处采取的操作. 不同类型的增强包括”around”,”before”和”after”增强. (增强类型将在后面讨论.)包括Spring在内的许多AOP框架都将增强建模为拦截器,并在连接点周围维护一系列拦截器.
  • 切点(Pointcut):与连接点匹配的谓词. 建议与切入点表达式关联,并在与该切入点匹配的任何连接点处运行(例如,执行具有特定名称的方法). 切入点表达式匹配的连接点的概念是AOP的核心,并且Spring默认使用AspectJ切入点表达语言.
  • 引介(Introduction):代表类型声明其他方法或字段. Spring AOP允许您向任何建议对象引入新接口(和相应的实现). 例如,您可以使用引介使Bean实现IsModified接口,以简化缓存. (在AspectJ社区中,引介被称为类型间声明.)
  • 目标对象(Target object):一个或多个方面建议的对象. 也称为”建议对象”. 由于Spring AOP是使用运行时代理实现的,因此该对象始终是代理对象.
  • AOP代理(AOP proxy):由AOP框架创建的一个对象,用于实现方面合同(建议方法执行等). 在Spring Framework中,AOP代理是JDK动态代理或CGLIB代理.
  • 织入(Weaving):将方面与其他应用程序类型或对象链接以创建建议的对象. 这可以在编译时(例如,使用AspectJ编译器),加载时或在运行时完成. 像其他纯Java AOP框架一样,Spring AOP在运行时执行织入.

织入方式:

  • 编译期:在编译时,由编译器把切面调用编译进字节码,这种方式需要定义新的关键字并扩展编译器,AspectJ就扩展了Java编译器,使用关键字aspect来实现织入;
  • 类加载器:在目标类被装载到JVM时,通过一个特殊的类加载器,对目标类的字节码重新“增强”;
  • 运行期:目标对象和切面都是普通Java类,通过JVM的动态代理功能或者第三方库实现运行期动态织入。

最简单的方式是第三种,Spring的AOP实现就是基于JVM的动态代理。由于JVM的动态代理要求必须实现接口,如果一个普通类没有业务接口,就需要通过CGLIB或者Javassist这些第三方库实现。

Spring AOP能力和目标

Spring AOP是用纯Java实现的. 不需要特殊的编译过程. Spring AOP不需要控制类加载器的层次结构,因此适合在Servlet容器或应用程序服务器中使用.

Updated: