论坛首页 Java企业应用论坛

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

浏览 4434 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-18   最后修改:2010-01-29
  在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.最先被代理的拦截器最后执行, 典型的栈的先进后出, 看样子如果要实现"链式"代理还需要利用栈

   发表时间:2008-12-03  
为何不放在一个拦截器里面呢?
0 请登录后投票
   发表时间:2008-12-04  
代理除了应用在访问权限上,其他还适合什么场景?
0 请登录后投票
   发表时间:2008-12-04  
拦截代理 一个事务,只要调用save(object),自动提交数据,不用commite;
0 请登录后投票
   发表时间:2008-12-04  
ls的能否说的清楚点,怎么做,能否提供示例?谢谢!
0 请登录后投票
   发表时间:2008-12-08  
  这个帖子的目的的确是在强调拦截器,而且是多重拦截. 类似于Strtus2对action的拦截. 因为实际项目中, 如果只是为了一个多重拦截而引入一个第三方的工具(比如spring), 似乎不太划算.
  在写测试代码的时候, 是用了多重代理来实现多重拦截, 其实也可以用责任链模式来实现, 后者可能更清晰一些, 更优雅一些.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics