技术开发 频道

AOP详解和AspectJ

  AspectJ实现

  下面我们使用AOP的实现之一AspectJ来对上述需求改写。AspectJ是AOP最早成熟的Java实现,它稍微扩展了一下Java语言,增加了一些Keyword等,pointcut的语法如下:

public pointcut 方法名:call(XXXX)

  AspectJ增加了pointcut, call是pointcut类型。因为AspectJ使用了一些特别语法,所以Java编译器就不能用SUN公司提供javac了,必须使用其专门的编译器,也许SUN在以后JDK版本中会引入AOP。

  使用AspectJ如何实现上图所谓切面式的编程呢?首先,我们将上图纵向切面称为Aspect,那么我们建立一个类似Class的Aspect,Java中建立一个Class代码如下:

public class MyClass{   //属性和方法 ... }
  同样,建立一个Aspect的代码如下:
public aspect MyAspect{   //属性和方法 ... }
  建立一个Aspect名为Lock,代码如下:
import EDU.oswego.cs.dl.util.concurrent.*; public aspect Lock {   ......   ReentrantWriterPreferenceReadWriteLock rwl =      new ReentrantWriterPreferenceReadWriteLock();   public pointcut writeOperations():     execution(public boolean Worker.createData()) ||     execution(public boolean Worker.updateData()) ||     execution(public boolean AnotherWorker.updateData()) ;   before() : writeOperations() {     rwl.writeLock().acquire();//上锁 advice body   }   after() : writeOperations() {      rwl.writeLock().release(); //解锁 advice body   }   ...... }

  上述代码关键点是pointcut,意味切入点或触发点,那么在那些条件下该点会触发呢?是后面红字标识的一些情况,在执行Worker的createData()方法,Worker的update方法等时触发。

  before代表触发之前做什么事情?
  答案是上锁。

  after代表触发之后做什么事情?
  答案是上锁。

  通过引入上述aspect,那么Worker代码可以清洁如下:

public class Worker extends Thread {   Data data;   public boolean createData() {    try {     //对data实行写逻辑操作            }catch() {      return false;    }    return true;   }   public boolean updateData() {    try {     //对data实行写逻辑操作            }catch() {      return false;    }finally{    }    return true;   }   public void run() {     //执行createData()或updateData()   } }
  Worker中关于“锁”的代码都不见了,纯粹变成了数据操作的主要方法。
0
相关文章