技术开发 频道

AOP详解和AspectJ

  AOP术语

  通过上例已经知道AspectJ如何从切面crosscutting来解决并发访问应用需求的,其中最重要的是引入了一套类似事件触发机制。

  Pointcut类似触发器,是事件Event发生源,一旦pointcut被触发,将会产生相应的动作Action,这部分Action称为Advice。

  Advice在AspectJ有三种:before、 after、Around之分,上述aspect Lock代码中使用了Advice的两种before和after。

  所以AOP有两个基本的术语:Pointcut和Advice。你可以用事件机制的Event和Action来类比理解它们。上述并发访问应用中pointcut和advice:


  小结如下:

  advice - 真正的执行代码,或者说关注的实现。 类似Action。

  join point - 代码中激活advice被执行的触发点。

  pointcut - 一系列的join point称为pointcut,pointcut有时代指join point

  其中advice部分又有:

  Interceptor - 解释器并没有在AspectJ出现,在使用JDK动态代理API实现的AOP框架中使用,解释有方法调用或对象构造或者字段访问等事件,是调用者和被调用者之间的纽带,综合了Decorator/代理模式甚至职责链等模式。

  Introduction - 修改一个类,以增加字段、方法或构造或者执行新的接口,包括Mixin实现。

  例如上述并发访问应用中,如果想为每个Data对象生成相应的aspect Lock,那么可以在aspect Lock中人为数据对象增加一个字段lock,如下:

aspect Lock {   Data sharedDataInstance;   Lock( Data d ) {      sharedDataInstance = d;   }   introduce Lock Data.lock; //修改Data类,增加一字段lock   advise Data() { //Data构造时触发    static after {     //当Data对象生成时,将Data中lock字段赋值为aspect Lock    //为每个Data对象生成相应的aspect Lock        thisObject.lock = new Lock( thisObject );      }    }   .... }

  上述代码等于在Data类中加入一行:

public class Data{   ......   Lock lock = new Lock();   ...... }

  还有其它两个涉及AOP代码运行方式:

  weaving - 将aspect代码插入到相应代码中的过程,一般是编译完成或在运行时动态完成。取决于具体AOP产品,例如AspectJ是使用特殊编译器在编译完成weaving,而nanning、JBoss AOP是使用动态代理API,因此在运行时动态完成weaving的。

  instrumentor - 用来实现weaving功能的工具。

0
相关文章