自从接触到AOP设计以来,它的力量一直令我折服;再进一步学习AspectJ,它的魅力总能使我的瞳孔放大数倍。我常给好友开玩笑的这样比喻:
她像一个美少女般的温柔,让我们多了一种对付软件的复杂和需求的巨变的美人计。所以记录一下我和这位“美女”相处的点滴。
现在从简单开始,就像是你与美女相处~~~~~ 刚见面还是慢慢深入。
一个简单的程序:
public class Ajtest {
String show = "";
public Ajtest(){
}
public void setMessage1(){
show = "message1";
show();
}
public void setMessage2(){
show = "message2";
show();
}
protected void show(){
System.out.println(show);
}
public static void main(String[] args){
Ajtest test = new Ajtest();
test.setMessage1();
test.setMessage2();
}
}
明显我要对加红色的字体加以处理,原因或者是随着类中的set方法的添加,我还要在新方法中加show()调用,又或者是随着需求变动:现在不但是要输出变量还要把变量持久化。抛开废话还是先看看怎么来搞吧??
~~卡卡~~
public aspect Ajtest_aj{
// 定义一个切入点为调用Ajtest类的任意参数任意返回值的show方法。
pointcut show() : call(* Ajtest.show(..));
// 定义一个警告信息,意思已经在下面了。
declare warning : show() && !within(Ajtest_aj) : "不能在从AJ以为的所有地方调用Ajtest类的show方法。";
// 定义一个切入点,该切入点是执行Ajtest实体的set方法,并返回test实体
pointcut replateClassShow(Ajtest test) : execution(* set*(..)) && this(test);
// 在切入点后执行,实体test的show()方法。
after(Ajtest test) returning : replaceClassShow(test) {
test.show();
}
}
复习词汇:this(Type)当前执行的对象是类型的实例时匹配连接点。
target(Type)目标对象是类型的实例时匹配连接点。