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代码如下:
同样,建立一个Aspect的代码如下:public class MyClass{
//属性和方法 ...
}
建立一个Aspect名为Lock,代码如下:public aspect MyAspect{
//属性和方法 ...
}
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代码可以清洁如下:
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()
}
}
0
相关文章
