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

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

接口类:

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()。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值