在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.最先被代理的拦截器最后执行, 典型的栈的先进后出, 看样子如果要实现"链式"代理还需要利用栈
分享到:
相关推荐
首先,动态代理是实现AOP的关键技术之一。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB。JDK动态代理基于接口,当目标类实现了至少一个接口时,Java会生成一个代理类来执行增强的代码。而CGLIB则是...
动态代理是实现AOP的一种常用技术,它允许在运行时创建代理对象,拦截对真实对象的调用,并在调用前后添加额外的行为。 在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
本话题主要围绕"Java分页"、"动态代理"以及"AOP(面向切面编程)"在Spring框架中的实现进行详细讲解。 首先,我们来看"Java分页"。在处理大量数据时,一次性加载所有数据不仅会消耗大量的内存,也可能导致用户界面...
通过对这个简单的AOP拦截器实现的学习,我们可以进一步探索如何结合注解驱动的AOP、环绕通知(`Around Advice`)、代理模式的实现细节、以及如何在实际项目中利用AOP解决实际问题。AOP是Spring框架的强大工具,理解...
总结来说,Spring AOP通过动态代理实现了面向切面编程,利用反射在运行时生成代理对象并插入通知代码。这种设计让开发者能够专注于业务逻辑,而不必关心横切关注点的实现细节,提高了代码的可维护性和复用性。理解...
在J2EE(Java 2 Platform, Enterprise Edition)环境中,AOP的动态代理实现机制是一种常用的技术手段,它利用了Java的反射机制。Java的动态代理可以分为接口型和类型两种。接口型动态代理要求目标对象实现一个接口,...
另一种实现方式是使用动态代理(如System.Linq.Expressions或PostSharp库),它们可以更高效地处理拦截逻辑,而无需在运行时进行反射。动态代理可以在编译时或运行时创建代理类,这些代理类会包裹目标方法,并在调用...
本文将深入讲解如何利用Java动态代理技术来实现AOP,以便于读者理解并实践。 #### 二、面向切面编程(AOP)简介 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在通过将横切关注点与...
总的来说,JDK动态代理是Spring AOP实现的基础,它允许我们在运行时动态创建代理对象,实现对方法调用的拦截和增强。Spring AOP则在此基础上提供了更高级的抽象,让我们可以方便地定义和管理切面,从而实现更灵活的...
在Java中,我们可以利用Java自带的动态代理机制或者第三方库如CGLIB、ASM等来实现这一目标。 首先,让我们了解Java内置的动态代理机制。Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`...
在这个场景中,我们将讨论如何利用AOP来实现Controller的日志管理,以捕获并记录应用程序中的异常。 首先,我们需要了解Spring AOP的基础概念。AOP允许我们定义“切面”,这些切面是关注点的模块化,如日志记录。切...
Spring AOP可以利用JDK动态代理来实现对方法的拦截,当调用目标对象的方法时,实际上执行的是代理对象的方法,从而实现在方法执行前后加入额外逻辑。 以下是使用JDK动态代理实现Spring AOP的步骤: 1. **定义切面...
例如,`Castle.DynamicProxy`库就是基于动态代理实现AOP的。动态代理在运行时创建代理类,可以针对接口或者抽象类,而不需要重新编译源代码。这使得代码更加灵活,但性能相比静态织入略低。 3. **特性驱动编程**: ...
在Spring框架中,我们可以利用AOP和代理模式来创建日志拦截器,从而实现对程序执行过程的记录。拦截器会在方法调用前后执行特定操作,例如在方法执行前记录开始时间,在方法执行后记录结束时间和执行结果,以及可能...
在Spring框架中,AOP通过代理模式实现,可以是JDK动态代理或CGLIB代理。 1. **定义切点(Pointcut)** 切点是程序中我们想要拦截的特定方法或类。在Spring AOP中,我们使用`@Pointcut`注解来定义切点表达式,例如...
这个DEMO涵盖了从客户端调用到服务处理的完整流程,展示了如何利用WCF路由、免代理调用和AOP拦截器来构建一个高效、灵活的服务架构。开发者可以通过深入研究这些代码,学习如何在实际项目中实现类似的功能。
在Spring AOP中,拦截器调用的实现是通过动态代理机制来完成的,主要涉及到JDK的Proxy类和InvocationHandler接口。本文将详细解析Spring AOP如何利用这两个组件来实现拦截器链的调用。 首先,Spring在生成代理对象...
以下是如何利用动态代理实现AOP的基本步骤: 1. 创建一个接口,定义横切关注点所涉及的方法。 2. 创建一个实现该接口的类,实现具体的功能逻辑。 3. 实现InvocationHandler接口,覆写invoke方法。在invoke方法中,...
Java动态代理是Java编程中一个重要的特性,它允许在运行时创建代理对象,这些代理对象可以作为原有对象的代理,实现在调用方法时添加额外的功能。Spring AOP(面向切面编程)正是利用了这一特性来实现其核心功能——...