`
icyiwh
  • 浏览: 7674 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • 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.最先被代理的拦截器最后执行, 典型的栈的先进后出, 看样子如果要实现"链式"代理还需要利用栈

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

相关推荐

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类实现了至少一个接口时,Java会生成一个代理类来执行增强的代码。而CGLIB则是...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...

    spring之AOP(动态代理)

    在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...

    java分页 动态代理 aop实现

    本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...

    spring aop 拦截器简单实现

    通过对这个简单的AOP拦截器实现的学习,我们可以进一步探索如何结合注解驱动的AOP、环绕通知(`Around Advice`)、代理模式的实现细节、以及如何在实际项目中利用AOP解决实际问题。AOP是Spring框架的强大工具,理解...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    总结来说,Spring AOP通过动态代理实现了面向切面编程,利用反射在运行时生成代理对象并插入通知代码。这种设计让开发者能够专注于业务逻辑,而不必关心横切关注点的实现细节,提高了代码的可维护性和复用性。理解...

    AOP技术及其在J2EE中动态代理实现

    在J2EE(Java 2 Platform, Enterprise Edition)环境中,AOP的动态代理实现机制是一种常用的技术手段,它利用了Java的反射机制。Java的动态代理可以分为接口型和类型两种。接口型动态代理要求目标对象实现一个接口,...

    .net中attribute实现方法调用拦截(就是aop)

    另一种实现方式是使用动态代理(如System.Linq.Expressions或PostSharp库),它们可以更高效地处理拦截逻辑,而无需在运行时进行反射。动态代理可以在编译时或运行时创建代理类,这些代理类会包裹目标方法,并在调用...

    java 动态代理实现AOP

    本文将深入讲解如何利用Java动态代理技术来实现AOP,以便于读者理解并实践。 #### 二、面向切面编程(AOP)简介 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在通过将横切关注点与...

    JDK动态代理 spring aop 的原理

    总的来说,JDK动态代理是Spring AOP实现的基础,它允许我们在运行时动态创建代理对象,实现对方法调用的拦截和增强。Spring AOP则在此基础上提供了更高级的抽象,让我们可以方便地定义和管理切面,从而实现更灵活的...

    动态代理实现AOP思想

    在Java中,我们可以利用Java自带的动态代理机制或者第三方库如CGLIB、ASM等来实现这一目标。 首先,让我们了解Java内置的动态代理机制。Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`...

    springMVC AOP拦截拦截Controller等实现日志管理

    在这个场景中,我们将讨论如何利用AOP来实现Controller的日志管理,以捕获并记录应用程序中的异常。 首先,我们需要了解Spring AOP的基础概念。AOP允许我们定义“切面”,这些切面是关注点的模块化,如日志记录。切...

    Spring-AOP-JDK动态代理

    Spring AOP可以利用JDK动态代理来实现对方法的拦截,当调用目标对象的方法时,实际上执行的是代理对象的方法,从而实现在方法执行前后加入额外逻辑。 以下是使用JDK动态代理实现Spring AOP的步骤: 1. **定义切面...

    利用C#实现AOP常见的几种方法详解

    例如,`Castle.DynamicProxy`库就是基于动态代理实现AOP的。动态代理在运行时创建代理类,可以针对接口或者抽象类,而不需要重新编译源代码。这使得代码更加灵活,但性能相比静态织入略低。 3. **特性驱动编程**: ...

    (入门)什么是AOP?什么是代理模式?怎么设计日志拦截器?

    在Spring框架中,我们可以利用AOP和代理模式来创建日志拦截器,从而实现对程序执行过程的记录。拦截器会在方法调用前后执行特定操作,例如在方法执行前记录开始时间,在方法执行后记录结束时间和执行结果,以及可能...

    springaop拦截controller日志

    在Spring框架中,AOP通过代理模式实现,可以是JDK动态代理或CGLIB代理。 1. **定义切点(Pointcut)** 切点是程序中我们想要拦截的特定方法或类。在Spring AOP中,我们使用`@Pointcut`注解来定义切点表达式,例如...

    WCF路由、免代理、实现AOP拦截源码附数据库

    这个DEMO涵盖了从客户端调用到服务处理的完整流程,展示了如何利用WCF路由、免代理调用和AOP拦截器来构建一个高效、灵活的服务架构。开发者可以通过深入研究这些代码,学习如何在实际项目中实现类似的功能。

    Spring源代码解析(七):Spring_AOP中对拦截器调用的实现.doc

    在Spring AOP中,拦截器调用的实现是通过动态代理机制来完成的,主要涉及到JDK的Proxy类和InvocationHandler接口。本文将详细解析Spring AOP如何利用这两个组件来实现拦截器链的调用。 首先,Spring在生成代理对象...

    基于JAVA的动态代理实现的AOP的研究.pdf

    以下是如何利用动态代理实现AOP的基本步骤: 1. 创建一个接口,定义横切关注点所涉及的方法。 2. 创建一个实现该接口的类,实现具体的功能逻辑。 3. 实现InvocationHandler接口,覆写invoke方法。在invoke方法中,...

    Java动态代理(Spring Aop原理)

    Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以作为原有对象的代理,实现在调用方法时添加额外的功能。Spring AOP(面向切面编程)正是利用了这一特性来实现其核心功能——...

Global site tag (gtag.js) - Google Analytics