1.JAVA-JDK的动态代理
代码清单6-6 PerformanceHandler
package com.baobaotao.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class PerformanceHandler implements InvocationHandler {//①实现InvocationHandler
private Object target;
public PerformanceHandler(Object target){ //②target为目标的业务类
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) ③
throws Throwable {
PerformanceMonitor.begin(target.getClass().getName()+"."+ method. getName());③-1
Object obj = method.invoke(target, args);// ③-2通过反射方法调用业务类的目标方法
PerformanceMonitor.end();③-1
return obj;
}
}
package com.baobaotao.proxy;
import java.lang.reflect.Proxy;
public class TestForumService {
public static void main(String[] args) {
//①希望被代理的目标业务类
ForumService target = new ForumServiceImpl();
//②将目标业务类和横切代码编织到一起
PerformanceHandler handler = new PerformanceHandler(target);
//③根据编织了目标业务类逻辑和性能监视横切逻辑的InvocationHandler实例创建代理实例
ForumService proxy = (ForumService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
handler);
//④调用代理实例
proxy.removeForum(10);
proxy.removeTopic(1012);
}
}
代理对象会重写接口的方法,设想这个方法会去调用handler 的invoke方法
2.CGLib动态代理
CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势织入横切逻辑。下面,我们采用CGLib技术,编写一个可以为任何类创建织入性能监视横切逻辑代理对象的代理创建器,如代码清单 6-8所示:
package com.baobaotao.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor {
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz) {
enhancer.setSuperclass(clazz); //① 设置需要创建子类的类
enhancer.setCallback(this);
return enhancer.create(); //②通过字节码技术动态创建子类实例
}
//③拦截父类所有方法的调用
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
PerformanceMonitor.begin(obj.getClass().getName()+"."+method. getName());//③-1
Object result=proxy.invokeSuper(obj, args); ③-2
PerformanceMonitor.end();//③-1通过代理类调用父类中的方法
return result;
}
}
package com.baobaotao.proxy;
import java.lang.reflect.Proxy;
public class TestForumService {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
ForumServiceImpl forumService = ①
(ForumServiceImpl )proxy.getProxy(ForumServiceImpl.class);
forumService.removeForum(10);
forumService.removeTopic(1023);
}
}
设想生成的代理对象(实际对象的子类对象)会重写父类的方法,里面回调了父类对象的方法
分享到:
相关推荐
Spring 框架中 JDK 动态代理和 CGLIB 动态代理是 Spring AOP 中一个非常重要的知识点。Spring AOP 框架会根据实际情况选择使用 JDK 的动态代理还是 CGLIB 的动态代理。 JDK 动态代理是 Java 自带的动态代理机制,它...
Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...
总的来说,Spring AOP通过JDK动态代理提供了一种灵活的方式来实现横切关注点,使得业务代码更专注于核心功能,而无需关心日志、事务等通用逻辑。这极大地提高了代码的可读性和可维护性。在实际项目中,熟练掌握...
在Spring中,AOP主要通过两种动态代理技术实现:JDK动态代理和CGLIB动态代理。 首先,让我们详细了解一下JDK动态代理。JDK动态代理基于Java的接口实现,它适用于目标对象实现了至少一个接口的情况。在运行时,JDK...
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...
在Java编程领域,JDK动态代理是实现动态创建代理对象的一种技术,它是Java标准库提供的一种强大工具。Spring AOP(面向切面编程)则是一种流行的应用框架,它利用动态代理来实现对业务代码的切面增强,如日志、事务...
在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...
Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,Spring AOP会采用CGLIB来生成代理对象。CGLIB(Code Generation Library)是一个开源的代码生成库,它允许运行时在内存中...
代理可以分为两种类型:基于接口的JDK动态代理和基于类的CGLIB代理。JDK动态代理要求目标对象实现至少一个接口,而CGLIB则不需要这个限制,它通过继承目标类来创建代理对象。 要使用CGLIB,我们并不需要单独引入...
1. **静态代理**:Spring AOP 提供了两种代理方式,一种是静态代理,另一种是动态代理。静态代理是在编译时就确定了代理类,这种代理方式通常通过实现相同接口的方式创建。然而,Spring AOP默认并不使用静态代理,...
- Spring支持两种类型的代理:JDK动态代理(如果目标对象实现了接口)和CGLIB代理(如果目标对象没有接口,使用字节码生成技术)。 - 在Spring配置中,可以使用`@Aspect`注解定义切面,`@Before`、`@After`、`@...
1. **JDK动态代理**:Spring在没有CGLIB库的情况下,会使用Java的反射API创建动态代理。动态代理类会实现目标接口,并在调用接口方法时插入通知。因此,使用JDK动态代理的目标类必须实现至少一个接口。 2. **CGLIB...
动态代理主要分为两种技术:JDK动态代理和CGLIB动态代理。 ### JDK动态代理 JDK动态代理是Java内置的一种机制,依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。以下是JDK动态...
在Spring中,AOP通过代理机制实现,分为两种主要的代理方式:JDK动态代理和CGLIB代理。 JDK动态代理是基于Java的反射API来创建代理类的。当目标对象实现了接口时,Spring会使用JDK动态代理。动态代理的工作原理是:...
Spring AOP支持两种动态代理机制: 1. **JDK动态代理**:基于接口的代理,如果目标对象实现了接口,Spring会使用`java.lang.reflect.Proxy`创建代理对象。 2. **CGLIB动态代理**:如果目标对象没有实现接口,Spring...
它提供了一种更高级的动态代理机制,不仅可以基于JDK动态代理,还可以基于CGLIB库生成字节码实现代理。AOP允许开发者定义“切面”(Aspect),切面封装了关注点,如日志、事务、安全检查等,使得这些功能可以独立于...
静态代理--不适合企业开发,适合初学者理解代理。 jdk动态代理--适合企业级开发,但是它要求必须面向接口编程,假如目标类没有实现接口...spring 的AOP功能中 会根据目标类是否实现了接口来判断使用 jdk Proxy还是cglib
在Spring AOP中,当目标对象实现了至少一个接口时,Spring会使用JDK的动态代理来创建代理对象。这是因为JDK的动态代理只适用于实现了接口的类,它通过生成一个与目标类接口相同的新类来实现代理。这个新类在运行时被...
JDK和CGLIB是Java中实现动态代理的两种主要方式,它们在Spring框架中扮演着关键角色,尤其是在AOP(面向切面编程)中。 1. **JDK动态代理**: JDK动态代理基于Java的接口机制实现,因此,要使用JDK动态代理,被...
本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...