温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java Proxy代理怎么学习

发布时间:2026-09-19 12:22:27 来源:亿速云 阅读:99 作者:小樊 栏目:编程语言

学习 Java 的 Proxy(代理),建议按「概念 → 分类 → 写法 → 原理 → 实战」循序渐进。下面给你一条清晰的学习路线。


一、先搞清楚:什么是代理(Proxy)

代理 = 替原对象干活的中介

  • 真实对象:被代理类(Target)
  • 代理对象:客户端实际调用的对象
  • 作用:
    • 不修改原代码,增强功能(日志、事务、权限、监控)
    • 解耦
    • 实现 AOP 思想

二、Java 中代理的两种主要方式

1️⃣ 静态代理(基础必学)

特点

  • 代理类手写
  • 编译期就确定

示例

interface UserService {
    void save();
}

class UserServiceImpl implements UserService {
    public void save() {
        System.out.println("保存用户");
    }
}

class UserServiceProxy implements UserService {
    private UserService target;

    UserServiceProxy(UserService target) {
        this.target = target;
    }

    public void save() {
        System.out.println("before");
        target.save();
        System.out.println("after");
    }
}

✅ 适合理解“代理是什么”


2️⃣ 动态代理(重点)

(1)JDK 动态代理(面试高频)

特点

  • 基于接口
  • 使用 java.lang.reflect.Proxy

核心类

  • Proxy.newProxyInstance(...)
  • InvocationHandler

示例

UserService proxy = (UserService) Proxy.newProxyInstance(
    target.getClass().getClassLoader(),
    target.getClass().getInterfaces(),
    (p, method, args) -> {
        System.out.println("before");
        Object result = method.invoke(target, args);
        System.out.println("after");
        return result;
    }
);

✅ 必须掌握:

  • 为什么只能代理接口
  • InvocationHandler 的作用

(2)CGLIB 动态代理(Spring 常用)

特点

  • 基于继承
  • 可代理类(无需接口)
  • Spring AOP 默认方式(无接口时)

示例(简化)

Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
    System.out.println("before");
    Object result = proxy.invokeSuper(obj, args);
    System.out.println("after");
    return result;
});

三、学习顺序建议

  1. 先写 静态代理(懂概念)
  2. 再写 JDK 动态代理(重点)
  3. 了解 CGLIB
  4. 看 Spring AOP 源码如何使用代理

四、典型应用场景

  • 日志
  • 事务管理
  • 权限校验
  • RPC 框架(如 Dubbo)
  • MyBatis Mapper 接口

五、常见面试问题

  • JDK 动态代理和 CGLIB 区别?
  • 为什么 JDK 代理只能代理接口?
  • Spring 如何选择代理方式?
  • 动态代理性能问题?

六、推荐学习资料

  • 《Java 核心技术》
  • Spring 官方文档(AOP 部分)
  • B站:动态代理底层原理
  • 源码:java.lang.reflect.Proxy

如果你愿意,我可以:

  • 给你 一步步手写动态代理
  • 用 Spring AOP 实际案例讲
  • 或画一张 代理关系图

你想从哪一块开始?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手