切面(Aspect) 一个关注点的模块化这个关注点可能会横切多个对象事务管理是JEE应用中一个关于横切关注点的很好的例子 在Spring AOP中切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解(@AspectJ风格)来实现
连接点(Joinpoint) 在程序执行过程中某个特定的点比如某方法调用的时候或者处理异常的时候 在Spring AOP中一个连接点 总是 代表一个方法的执行 通过声明一个orgaspectjlangJoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息
通知(Advice) 在切面的某个特定的连接点(Joinpoint)上执行的动作通知有各种类型其中包括aroundbefore和after等通知 通知的类型将在后面部分进行讨论许多AOP框架包括Spring都是以拦截器做通知模型 并维护一个以连接点为中心的拦截器链
切入点(Pointcut) 匹配连接点(Joinpoint)的断言通知和一个切入点表达式关联并在满足这个切入点的连接点上运行(例如当执行某个特定名称的方法时) 切入点表达式如何和连接点匹配是AOP的核心Spring缺省使用AspectJ切入点语法
引入(Introduction) (也被称为内部类型声明(intertype declaration))声明额外的方法或者某个类型的字段 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象 例如你可以使用一个引入来使bean实现 IsModified 接口以便简化缓存机制
目标对象(Target Object) 被一个或者多个切面(aspect)所通知(advise)的对象也有人把它叫做 被通知(advised) 对象 既然Spring AOP是通过运行时代理实现的这个对象永远是一个 被代理(proxied) 对象
AOP代理(AOP Proxy) AOP框架创建的对象用来实现切面契约(aspect contract)(包括通知方法执行等功能) 在Spring中AOP代理可以是JDK动态代理或者CGLIB代理 注意Spring 最新引入的基于模式(schemabased)风格和@AspectJ注解风格的切面声明对于使用这些风格的用户来说代理的创建是透明的
织入(Weaving) 把切面(aspect)连接到其它的应用程序类型或者对象上并创建一个被通知(advised)的对象 这些可以在编译时(例如使用AspectJ编译器)类加载时和运行时完成 Spring和其他纯Java AOP框架一样在运行时完成织入
通知的类型
前置通知(Before advice) 在某连接点(join point)之前执行的通知但这个通知不能阻止连接点前的执行(除非它抛出一个异常)
返回后通知(After returning advice) 在某连接点(join point)正常完成后执行的通知例如一个方法没有抛出任何异常正常返回
抛出异常后通知(After throwing advice) 在方法抛出异常退出时执行的通知
后通知(After (finally) advice) 当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)
环绕通知(Around Advice) 包围一个连接点(join point)的通知如方法调用这是最强大的一种通知类型 环绕通知可以在方法调用前后完成自定义的行为它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行