Aop 中的相关概念介绍:
切面( Aspect ) :一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是 J2EE 应用中一个横切关注点的很好例子。在 Spring AOP 中,切面可以使用通用类(基于模式的风格)或者在普通类中以 @Aspect 注解 (@Aspect 风格来实现 ) 。
连接点 (Joinpoint) : 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在 Spring AOP 中,一个连接点总是代表一个 方法的执行。通过声明一个 org.aepectj.lang.JoinPoint 类型的参数可以是通知 (Advice) 的主体部分获得连接点的信息。
通知 (Advice) : 在切面的某个特定的连接点 (Jointpoint 上执行的动作 ) 。通知有各种类型,其中包括 ”around”,”before” 和 ”after” 等通知。
切入点( Pointcut ) :匹配连接点 (Jointpoint) 的断言,通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行,切入点表达式如何和连接点匹配是 AOP 的核心: Spring 缺省使用 AspectJ 切入点语法。
引入 (Introduction) (也被称为内部类型声明 inter-type declaration )。声明额外的方法或者某个类型的字段。 Spring 允许引入新的接口 ( 以及一个对应的实现 ) 到任何被代理的对象。例如,你可以使用一个引入来是 bean 实现 IsModified 接口,以便简化缓存机制。
目标对象 (Target Object) : 被一个或多个切面 (aspect) 所通知 (advise) 的对象。也有人把它叫做被通知 (advised) 对象。既然 Spring AOP 是通过运行时代理实现的,这个对象永远是一个被代理 (proxied) 对象。
AOP 代理 (AOP Proxy) :Aop 框架创建的对象,用来实现切面契约 (aspect contract) (包括通知方法执行等功能)。在 Spring 中 Aop 代理可以是 JDK 动态代理或者 CGLIB 代理。注意: Spring2.0 最新引入的基于模式 (schema-based) 风格和 @Aspect 注解风格的切面声明,对于使用这些风格的用户来说,代理的创建时透明的。
织入 (Weaving) : 把切面 (aspect) 连接到其他的应用程序类型或者对象上,并创建一个被通知 (advised) 的对象。这些可以在编译时 ( 例如使用 Aspect 编译器 ) ,类加载时和运行时完成。 Spring 和其他纯 Java AOP
框架一样,在运行时完成织入。
通知的类型:
★ 前置通知 (Before advice): 在某连接点 (join point) 之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
★ 返回后通知 (After returning advice): 在某连接点 (join point) 正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
★ 抛出异常后通知 (After throwing advice): 在方法抛出异常退出时执行的通知。
★ 后通知 (After ( finally ) advice): 当某个连接点退出的时候执行的通知 ( 无论是正常返回还是异常退出 ) 。
★ 环绕通知 (Around Advice): 包围一个连接点 (join point) 的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
环绕通知是最常用的一种通知类型。大部分基于拦截的 AOP 框架,例如 Nanning 和 Jboss4, 都只提供环绕通知。
跟 AspectJ 一样, Spring 提供所有类型的通知,我们推荐你使用尽量简单的通知类型来实现需要的功能。用最合适的通知类型可以使得编程模型变得简单,并且能够避免很多潜在的错误。
切入点( pointcut )和连接点( join point )匹配的概念是 AOP 的关键
Spring 目前仅支持使用方法调用作为连接点 (join point)( 在 Spring bean 上通知方法的执行 ) 。
Spring 实现 AOP 的方法跟其他的框架不同。 Spring 并不是要尝试提供最完整的 AOP 实现(尽管 Spring AOP 有这个能力), 相反的,它其实侧重于提供一种 AOP 实现和 Spring IoC 容器的整合,用于帮助解决在企业级开发中的常见问题。