5.1什么是AOP
让我们首先定义一些核心的AOP概念和术语。这些术语并非特定于Spring。不幸的是,AOP术语并不是特别直观。然而,如果Spring使用自己的术语,则会更加令人困惑。
- 方面(Aspect):跨越多个类的模块化关注点。事务管理是企业Java应用程序中横切关注点的一个很好的例子。在SpringAOP中,方面是通过使用常规类(基于模式的方法)或使用@Aspect注解(@Aspectj样式)注解的常规类来实现的。
- 连接点(Join point):程序执行过程中的一点,如方法的执行或异常的处理。在SpringAOP中,连接点总是表示一个方法执行。
- 通知(Advice):一个方面在特定连接点采取的行动。不同类型的通知包括“环绕”、“前“和”后”通知。(稍后将讨论通知类型。)许多AOP框架(包括Spring)将通知建模为拦截器,并在连接点周围维护拦截器链。
- 切点(Pointcut):与连接点匹配的谓词。通知与切入点表达式关联,并在与切入点匹配的任何连接点上运行(例如,使用特定名称执行方法)。pointcut表达式匹配的连接点概念是AOP的核心,Spring默认使用AspectJ pointcut表达式语言。
- 说明(Introduction):代表类型声明其他方法或字段。SpringAOP允许你向任何advised对象引入新的接口(和相应的实现)。例如,你可以使用一个Introduction使bean实现一个IsModified接口,以简化缓存。(introduction在AspectJ社区中称为类型间声明。)
- 目标对象(Target object):由一个或多个方面advised的对象。也称为“advised 对象”。因为SpringAOP是通过使用运行时代理实现的,所以这个对象始终是一个代理对象。
- AOP代理:由AOP框架创建的用于实现aspect contracts(通知方法执行等)的对象。在Spring框架中,AOP代理是JDK动态代理或CGLIB代理。
- 编织(Weaving):将aspects与其他应用程序类型或对象链接,以创建advised的对象。这可以在编译时(例如,使用AspectJ编译器)、加载时或运行时完成。Spring AOP和其他纯Java AOP框架一样,在运行时进行编织。
Spring AOP包含以下几种通知类型:
- Before advice:在连接点之前运行但不能阻止执行到连接点的通知(除非它抛出异常)。
- After returning advice:在连接点正常完成后要运行的通知(例如,如果方法返回并且不引发异常)。
- After throwing advice: 如果方法通过引发异常而退出,则要执行的通知。
- After (finally) advice:无论连接点退出的方式如何(正常或异常返回),都要执行的通知。
- Around advice:环绕连接点(如方法调用)的通知。这是最有力的通知。around通知可以在方法调用前后执行自定义行为。它还负责通过返回自己的返回值或引发异常来选择是继续到连接点还是快捷地执行通知的方法。
Around advice是最普遍的advice。由于Spring AOP和AspectJ一样提供了一系列完整的通知类型,我们建议你使用功能最差的通知类型来实现所需的行为。例如,如果只需要使用方法的返回值更新缓存,那么最好实现after returning advice ,而不是around advice,尽管around advice可以完成相同的事情。使用最具体的通知类型提供了一个更简单的编程模型,并且错误的可能性更小。例如,你不需要在用于around通知的joinpoint上调用proceed()方法,因此,你不会调用失败。
所有通知参数都是静态类型的,因此你可以使用适当类型的通知参数(例如,方法执行返回值的类型)而不是对象数组。
切入点匹配的连接点概念是AOP的关键,它将AOP与只提供拦截的旧技术区分开来。切入点使通知能够独立于面向对象的层次结构作为目标。例如,你可以将一个around通知应用到一组跨越多个对象的方法(例如服务层中的所有业务操作)上,从而提供声明性事务管理。