温馨提示×

温馨提示×

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

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

java Proxy代理和AOP关系

发布时间:2026-10-31 08:34:17 来源:亿速云 阅读:91 作者:小樊 栏目:编程语言

在 Java 中,Proxy(代理) 和 AOP(面向切面编程) 密切相关,但二者不在同一个抽象层级。可以一句话概括:

Java 的 Proxy 是实现 AOP 的一种技术手段,而 AOP 是一种编程思想。

下面分层说明它们的关系。


一、什么是 Proxy(代理)

1. 代理的本质

代理 = 在不修改原对象代码的前提下,对其方法进行增强或控制。

Java 中常见的代理方式:

2. Java 中的 Proxy 类型

  1. 静态代理

    • 手写代理类
    • 编译期确定
  2. JDK 动态代理

    • 基于接口
    • 使用 java.lang.reflect.Proxy
    Proxy.newProxyInstance(
        classLoader,
        interfaces,
        invocationHandler
    );
    
  3. CGLIB 代理

    • 基于子类
    • 不要求接口

二、什么是 AOP

1. AOP 的定义

AOP(Aspect-Oriented Programming):
将横切逻辑(如日志、事务、权限)从业务代码中剥离。

2. AOP 的核心概念

  • 切面(Aspect)
  • 连接点(JoinPoint)
  • 切入点(Pointcut)
  • 通知(Advice)
    • 前置 / 后置 / 环绕 / 异常

三、Proxy 和 AOP 的关系

1. 关系图(概念层级)

AOP(思想)
 │
 ├── 实现方式
 │    ├── 动态代理(JDK / CGLIB)
 │    ├── 字节码增强(ASM / ByteBuddy)
 │    └── 编译期织入(AspectJ)

2. 关键结论

  • AOP 不依赖 Proxy
  • Proxy 是实现 AOP 最常见方式之一
  • Spring AOP 底层就是 Proxy

四、Spring 中 Proxy 与 AOP 的关系(重点)

1. Spring AOP 的实现

  • 有接口 → JDK 动态代理
  • 无接口 → CGLIB 代理

2. 示例

@Aspect
@Component
public class LogAspect {
    @Before("execution(* com.xxx.*.*(..))")
    public void before() {
        System.out.println("before");
    }
}

底层等价于:

Proxy.newProxyInstance(
    ...,
    new InvocationHandler() {
        public Object invoke(...) {
            before();
            return method.invoke(target, args);
        }
    }
);

五、Proxy ≠ AOP 的全部

AOP 比 Proxy 更强的地方

  • 可控制方法、字段、构造器
  • 可编译期织入(AspectJ)
  • 颗粒度更细

Proxy 的局限

  • 只能代理方法
  • JDK 代理必须接口
  • 性能略低(反射)

六、一句话总结

Proxy 是“术”,AOP 是“道”
Spring 用 Proxy 把 AOP 思想落地,但 AOP 的本质不是 Proxy。

如果你愿意,我也可以:

  • 用 手写 Proxy 模拟 AOP
  • 对比 Spring AOP vs AspectJ
  • 画一张 调用链路图
向AI问一下细节

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

AI
助
手