温馨提示×

温馨提示×

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

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

java Proxy代理框架有哪些

发布时间:2026-10-31 07:50:19 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

在 Java 生态中,**“Proxy 代理框架”**通常可以从两个角度理解:

  1. JDK / 语言层面的代理机制
  2. 第三方代理 / AOP 框架(用于增强方法、实现切面等)

下面按常见分类给你一个系统梳理。


一、Java 原生代理机制

1. JDK 动态代理(java.lang.reflect.Proxy)

  • 特点
    • JDK 内置
    • 基于接口代理
    • 运行时生成代理类
  • 核心类
    • Proxy
    • InvocationHandler
  • 限制
    • 只能代理接口,不能代理类
  • 适用场景
    • RPC、简单 AOP、拦截器
Proxy.newProxyInstance(
    classLoader,
    new Class[]{UserService.class},
    (proxy, method, args) -> {
        // 前置逻辑
        return method.invoke(target, args);
    }
);

2. CGLIB(Code Generation Library)

  • 特点
    • 基于字节码生成
    • 可代理普通类(无需接口)
    • 通过继承实现代理
  • 核心类
    • Enhancer
    • MethodInterceptor
  • 限制
    • 不能代理 final 类 / final 方法
  • 使用场景
    • Spring AOP(无接口时)
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
    return proxy.invokeSuper(obj, args);
});

3. Byte Buddy(现代化字节码工具)

  • 特点
    • 比 ASM / CGLIB 更易用
    • 高性能
    • 支持类和接口代理
  • 使用方
    • Mockito
    • Spring Boot 部分场景
  • 适用场景
    • 高级代理、监控、Agent

4. ASM / Javassist(底层字节码框架)

  • 本质
    • 不是“代理框架”,而是字节码操作工具
  • 用途
    • 自定义代理生成
    • Java Agent
  • 复杂度
    • 高

二、AOP / 代理型框架(基于代理)

5. Spring AOP

  • 代理方式
    • 有接口 → JDK 动态代理
    • 无接口 → CGLIB
  • 特点
    • 声明式代理
    • 与 Spring 容器深度集成
  • 典型用途
    • 事务、日志、权限
@Transactional
public void save() {}

6. AspectJ

  • 特点
    • 编译期 / 类加载期织入
    • 不依赖代理
    • 功能最强
  • 与 Spring AOP 区别
    • Spring AOP:运行时代理
    • AspectJ:更底层、更全面

三、RPC / 远程代理框架

7. RMI(Remote Method Invocation)

  • 典型“远程代理”
  • 使用 java.rmi.proxy

8. 常见 RPC 框架(内部使用代理)

  • Dubbo
    • JDK / Javassist 动态代理
  • gRPC
    • 代码生成(非运行时代理)
  • Feign
    • 接口代理(HTTP)
@FeignClient("user-service")
public interface UserClient {
    @GetMapping("/user/{id}")
    User getUser(@PathVariable("id") Long id);
}

四、测试 / Mock 代理框架

9. Mockito

  • 基于 Byte Buddy
  • 用于方法 mock
UserService userService = mock(UserService.class);
when(userService.getName()).thenReturn("test");

五、总结对比

框架 / 技术 代理方式 是否需接口 典型用途
JDK Proxy 动态代理 ✅ 是 AOP、RPC
CGLIB 字节码 ❌ 否 Spring AOP
Byte Buddy 字节码 ❌ 否 Agent、Mock
Spring AOP 代理封装 可选 事务、日志
AspectJ 织入 否 强 AOP
Feign 接口代理 ✅ 是 HTTP 调用

如果你有具体使用场景(如:Spring 事务、性能监控、RPC、Mock 测试),我可以帮你推荐最合适的代理方案。

向AI问一下细节

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

AI
助
手