本文共 2668 字,大约阅读时间需要 8 分钟。
动态代理是一种编程模式,允许在运行时创建代理对象,以实现对目标对象的方法进行增强。代理对象与目标对象具有相同的接口,但在执行特定逻辑时嵌入增强功能或 调用其他对象的方法。动态代理通过动态生成代理对象的方式,为目标对象添加功能,如日志记录、事务管理等,减少代码耦合,降低代码重复率。
动态代理适用于在不侵入目标类逻辑的前提下,添加公共功能。例如:
这种方法能在不修改目标对象代码的前提下,降低代码耦合度,减少重复代码。
动态代理广泛应用于:
Proxy.newProxyInstance
方法创建代理对象。开源框架如Spring AOP默认使用该技术。final
修饰。特性 | JDK动态代理技术 | Cglib动态代理技术 |
---|---|---|
目标类要求 | 有接口 | 无接口,不能有final 修饰 |
生成方式 | 基于接口动态实现类 | 基于目标类生成动态子类 |
优点 | 非侵入性,代码独立性强 | 适用于不能实现接口或切断 inheritance |
缺点 | 需要接口接口分离 | 難以处理 final 方法,不能链式调用 |
public interface JDKService { void show(String s);}public class JDKServiceImpl implements JDKService { @Override public void show(String s) { System.out.println("JDKService show......" + s); }}public class JDKProxyDemo { public static void main(String[] args) { JDKService jdkService = new JDKServiceImpl(); Object proxyInstance = Proxy.newProxyInstance( jdkService.getClass().getClassLoader(), jdkService.getClass().getInterfaces(), (proxy, method, args) -> { System.out.println("Method: " + method.getName()); System.out.println("Args: " + Arrays.toString(args)); Object result = method.invoke(jdkService, args); System.out.println("Result: " + result); return result; } ); JDKService proxy = (JDKService) proxyInstance; proxy.show("hello"); }}
public class Target { public void show(String s) { System.out.println("Target show.......... " + s); }}public class Advice { public void before() { System.out.println("Advice before ......"); } public void after() { System.out.println("Advice after ......."); }}public class CglibProxyDemo { public static void main(String[] args) { Target target = new Target(); Advice advice = new Advice(); // 动态增强器 Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Target.class); // 设置被代理类 // 回调增强 enhancer.setCallback((MethodInterceptor o, Method method, Object objects, MethodProxy methodProxy) -> { advice.before(); Object result = method.invoke(target, objects); advice.after(); return result; }); Target proxy = (Target) enhancer.create(); proxy.show("hello"); }}
转载地址:http://ynryk.baihongyu.com/