动态代理详解

动态代理的原理、方式及应用场景

🔍 一、什么是动态代理?

动态代理就是在运行时,动态生成一个代理类,来“代理”你原本的对象,并添加一些额外逻辑。

相比静态代理(你手动写一个代理类),动态代理是自动帮你生成的!


🧱 二、动态代理的两种方式

技术依赖要求原理
JDK 动态代理Java 原生 API目标类必须实现接口使用 java.lang.reflect.Proxy 创建代理对象
CGLIB 动态代理第三方库(Spring 内置)没有接口也可以通过继承目标类 + 字节码技术生成代理子类

✅ 三、JDK 动态代理详解

1. 定义一个接口 + 实现类

public interface UserService {
    void addUser();
}

public class UserServiceImpl implements UserService {
    public void addUser() {
        System.out.println("添加用户");
    }
}

2. 写一个 InvocationHandler

这个类定义了你增强的逻辑

import java.lang.reflect.*;

public class LogHandler implements InvocationHandler {
    private Object target;

    public LogHandler(Object target) {
        this.target = target;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法调用前记录日志...");
        Object result = method.invoke(target, args);
        System.out.println("方法调用后记录日志...");
        return result;
    }
}

3. 使用 Proxy 创建代理对象

UserService target = new UserServiceImpl();

UserService proxy = (UserService) Proxy.newProxyInstance(
    target.getClass().getClassLoader(),
    target.getClass().getInterfaces(),
    new LogHandler(target)
);

proxy.addUser();  // 实际执行的是代理逻辑!

⚙️ 四、JDK 动态代理底层原理

  1. JVM 运行时生成一个代理类 $Proxy0

  2. 这个类实现了你给的接口(UserService)

  3. 所有方法调用都会被转发给 InvocationHandler.invoke()

  4. 你在 invoke() 中决定:怎么处理这个方法


💡 五、CGLIB 动态代理简介(Spring AOP 用得很多)

如果你没有接口,JDK 代理就失效了,这时用 CGLIB:

  • 它会生成一个目标类的子类,重写所有非 final 方法

  • 然后在重写方法中加入你要增强的逻辑

Spring 默认使用 CGLIB,如果目标类没有接口。


📌 六、动态代理 vs 静态代理

对比项静态代理动态代理
编写方式手动写代理类运行时自动生成
灵活性低,每个类都要写一次代理高,通用 InvocationHandler
接口要求JDK 要求必须有接口;CGLIB 无要求
性能稍好一点(但不明显)稍慢,需反射或字节码处理
Spring AOP 默认使用

🎯 七、动态代理的应用场景

  • Spring AOP(日志、权限、事务等)

  • RPC 框架(如 Dubbo)

  • ORM 框架(如 MyBatis Mapper)

  • 拦截器机制

  • 接口适配、Mock 测试等


🧠 总结一句话:

动态代理就是:你不用写代理类,Java 或 CGLIB 会帮你生成一个“假装是你”的对象,并在方法执行前后“做点别的事”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值