|
让我们从定义一些重要的aop概念开始。这些术语不是spring特有的。不幸的是,spring的术语 不是特别地直观。而且,如果spring使用自己的术语,这将使人更加迷惑。 -
方面(aspect): 一个关注点的模块化,这个关注点实现可能 另外横切多个对象。事务管理是j2ee应用中一个很好的横切关注点例子。方面用spring的 advisor或拦截器实现。 -
连接点(joinpoint): 程序执行过程中明确的点,如方法的调 用或特定的异常被抛出。 -
通知(advice): 在特定的连接点,aop框架执行的动作。各种类 型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多aop框架 包括spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器 链。 -
切入点(pointcut): 指定一个通知将被引发的一系列连接点 的集合。aop框架必须允许开发者指定切入点:例如,使用正则表达式。 -
引入(introduction): 添加方法或字段到被通知的类。 spring允许引入新的接口到任何被通知的对象。例如,你可以使用一个引入使任何对象实现 ismodified接口,来简化缓存。 -
目标对象(target object): 包含连接点的对象。也被称作 被通知或被代理对象。 -
aop代理(aop proxy): aop框架创建的对象,包含通知。 在spring中,aop代理可以是jdk动态代理或者cglib代理。 -
织入(weaving): 组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用aspectj编译器),也可以在运行时完成。spring和其他纯java aop框架一样, 在运行时完成织入。 各种通知类型包括: -
around通知: 包围一个连接点的通知,如方法调用。这是最 强大的通知。aroud通知在方法调用前后完成自定义的行为。它们负责选择继续执行连接点或通过 返回它们自己的返回值或抛出异常来短路执行。 -
before通知: 在一个连接点之前执行的通知,但这个通知 不能阻止连接点前的执行(除非它抛出一个异常)。 -
throws通知: 在方法抛出异常时执行的通知。spring提供 强类型的throws通知,因此你可以书写代码捕获感兴趣的异常(和它的子类),不需要从throwable 或exception强制类型转换。 -
after returning通知: 在连接点正常完成后执行的通知, 例如,一个方法正常返回,没有抛出异常。 around通知是最通用的通知类型。大部分基于拦截的aop框架,如nanning和jboss4,只提供 around通知。 如同aspectj,spring提供所有类型的通知,我们推荐你使用最为合适的通知类型来实现需 要的行为。例如,如果只是需要用一个方法的返回值来更新缓存,你最好实现一个after returning 通知而不是around通知,虽然around通知也能完成同样的事情。使用最合适的通知类型使编程模型变 得简单,并能减少潜在错误。例如你不需要调用在around通知中所需使用的的methodinvocation的 proceed()方法,因此就调用失败。 切入点的概念是aop的关键,使aop区别于其它使用拦截的技术。切入点使通知独立于oo的 层次选定目标。例如,提供声明式事务管理的around通知可以被应用到跨越多个对象的一组方法上。 因此切入点构成了aop的结构要素。
|