用Aspectj拦截接口类中的所有方法

  • Post author:
  • Post category:其他


先来看一个问题,如果业务代码中有一个类,它实现了某个接口,如下:

接口类:

public interface Foo {

    public void hello(String say);

    public void goodBye();
}

实现类:

public class SimpleFoo implements Foo {

    public void hello(String say) {
        System.out.println(say);
    }

    public void goodBye() {
        System.out.println("goodBye");
    }

    public void sayOthers() {
        System.out.println("sayOthers");
    }
}

假如现在有个要求,调用SimpleFoo里面的接口方法之前必需要先执行一段共同的代码,比如写日记,但是如果调用的如果不是接口里面定义的接口方法,比如上面的sayOthers(),就不需要执行这做段共同的代码。

实现上面这些要求并不是很难,我们可以利用AOP来定义一个point cut(切入点)来引用接口里面的方法,比如:

pointcut testInterface() : execution(* Foo.goodBye(..)) || execution(* Foo.hello(..));

@Before(value="testInterface()")
public void logToFile(JoinPoint thisJoinpPoint) {
        System.out.println("Logging something...");
    }

但这个point cut会有个扩展性的问题,假如以后接口类Foo添加了新的接口方法,这时就需要修改上的是point cut,把新的方法也加进去。有没有更好的方法呢?

所以就想到怎么来定义一个更灵活的point cut来选择接口中定义的所有接口方法,参考Eclipse Aspecj的文档,通过实践,我们可以几种方法写这个point cut

pointcut testInterface() : execution(* Foo.*(..));
pointcut testInterface() : execution(* Foo.*(*));

第一种将会选择Foo里面所有的接口方法hello(), goodBye(),执行advice.

第二种只选择Foo里面带一个参数的接口方法hello()。

更多的配置可以参考官方文档。



版权声明:本文为west_609原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。