代理模式通过代理层集中控制横切关注点,静态代理手动编写、JDK动态代理基于接口运行时生成、CGLIB通过子类代理具体类,Spring AOP以声明式配置实现自动织入。

代理模式通过在目标对象前后插入代理层,实现横切关注点(如日志、权限、缓存、监控)的集中控制,无需修改原有业务逻辑代码。
静态代理:手动编写代理类,明确分离关注点
创建与目标接口一致的代理类,在其方法中嵌入横切逻辑,再委托调用真实对象。适合关注点稳定、代理逻辑较简单的场景。
- 定义统一接口(如 UserService),让真实类(UserServiceImpl)和代理类(UserServiceProxy)都实现它
- 代理类持有一个真实对象引用,在 save() 等方法中先执行日志记录或权限校验,再调用 target.save()
- 客户端只依赖接口,用 new UserServiceProxy(new UserServiceImpl()) 替换原始实例,业务代码零改动
JDK 动态代理:面向接口,运行时生成代理字节码
基于反射和 InvocationHandler,在运行时为任意接口生成代理对象,灵活支持通用横切逻辑。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 实现 InvocationHandler,在 invoke() 方法中统一处理前置(如记录开始时间)、后置(如打印耗时)、异常(如统一告警)逻辑
- 用 Proxy.newProxyInstance() 创建代理实例,传入类加载器、目标实现的接口数组、以及自定义 handler
- 仅适用于接口——因为 JDK 代理本质是“实现接口”,无法代理具体类;若目标无接口,需配合其他方案(如 CGLIB)
CGLIB 代理:无接口限制,子类方式增强具体类
通过字节码技术生成目标类的子类,在子类方法中织入横切逻辑,适用于没有接口或需代理 final 方法以外的场景。
- 引入 cglib-nodep 依赖,使用 Enhancer 设置目标类、回调(MethodInterceptor)
- 在 intercept() 中完成环绕逻辑:可决定是否调用 method.invokeSuper(),支持跳过、重试、缓存返回值等精细控制
- 注意目标类不能是 final,方法也不能是 final;Spring AOP 在检测到无接口时会自动切换为 CGLIB
结合 Spring AOP:声明式配置,解耦更彻底
利用 Spring 的 @Aspect 注解和切点表达式,将横切逻辑抽离为独立切面,通过配置自动织入,开发时完全不感知代理细节。
- 写一个切面类,用 @Before("@annotation(org.springframework.web.bind.annotation.PostMapping)") 拦截所有 POST 接口
- 用 @Around("execution(* com.example.service..*.*(..))") 包裹 service 层方法,统一做性能统计
- 开启 @EnableAspectJAutoProxy,Spring 容器会自动为匹配 Bean 创建代理(JDK 或 CGLIB),业务代码保持纯净

















