先来看一个问题,如果业务代码中有一个类,它实现了某个接口,如下:
接口类:
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 版权协议,转载请附上原文出处链接和本声明。