AOP之: 利用动态代理实现拦截链

在java API中,提供了一组动态代理相关的包, 利用这些可以实现AOP拦截操作, 事实上大部分AOP实现都是基于JAVA动态代理, 但在java API中, 并没有实现"链式"代理, 如: 多个拦截器对同一个对象方法进行拦截. 当然, 几乎所有的AOP实现以及开源的框架都实现了"链式"代理, 自己刚好也尝试着来写一个最简单的实现.
首先定义业务逻辑接口, 及其实现类

interface Biz {
void doBiz();
}
class BizImpl implements Biz {
public void doBiz() {
System.out.println("这里是具体的业务操作");
}
}

其次, 需要定义n(在这儿只实现2个)个拦截器

class BizInvocationHandler1 implements InvocationHandler {
Biz biz = null;

public BizInvocationHandler1(Biz biz) {
this.biz = biz;
}

/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("这是代理1开始");
Object result = method.invoke(biz, args);
System.out.println("这是代理1结束");
return result;
}
}

class BizInvocationHandler2 implements InvocationHandler {
Biz biz = null;

public BizInvocationHandler2(Biz biz) {
this.biz = biz;
}

/*
* (non-Javadoc)
*
* @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
* java.lang.reflect.Method, java.lang.Object[])
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("这是代理2开始");
Object result = method.invoke(biz, args);
System.out.println("这是代理2结束");
return result;
}
}

最后是测试代码

Biz biz = new BizImpl();
InvocationHandler handler1 = new BizInvocationHandler1(biz);
Biz prox1 = (Biz)Proxy.newProxyInstance(Biz.class.getClassLoader(), new Class[]{Biz.class}, handler1);


InvocationHandler handler2 = new BizInvocationHandler2(prox1);
Biz prox2 = (Biz)Proxy.newProxyInstance(Biz.class.getClassLoader(), new Class[]{Biz.class}, handler2);
prox2.doBiz();

输出结果如下:

这是代理2开始
这是代理1开始
这里是具体的业务操作
这是代理1结束
这是代理2结束


分析:
1.业务逻辑方法被调用之前被定义的2个拦截器成功拦截,同理有n个拦截器就会被拦截n次(struts2等开源项目的实现是不是也是这样呐? 等什么时候细读源码再下结论)
2.最先被代理的拦截器最后执行, 典型的栈的先进后出, 看样子如果要实现"链式"代理还需要利用栈
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值