Spring AOP原理是什么 Spring AOP动态代理实现【教程】

老伟姑娘_4836

老伟姑娘_4836

2026-05-09

768人浏览

原创

Spring AOP默认自动选择代理方式:目标类实现接口时用JDK动态代理,否则用CGLIB;可通过@EnableAspectJAutoProxy(proxyTargetClass = true)强制启用CGLIB。

spring aop原理是什么 spring aop动态代理实现【教程】

Spring AOP 的核心原理是基于代理(Proxy)机制,在不修改原始类代码的前提下,为方法调用“织入”横切逻辑(如日志、事务、权限校验等)。它本身不直接操作字节码,而是依托 Java 的动态代理技术,在运行时生成代理对象,拦截目标方法执行流程。

Spring AOP 默认使用 JDK 动态代理还是 CGLIB?

Spring 会自动选择:

  • 如果目标类实现了至少一个接口,默认用 JDK 动态代理(基于 java.lang.reflect.Proxy),代理接口类型;
  • 如果目标类没有实现任何接口,则强制使用 CGLIB 代理(通过字节码增强生成子类);
  • 你也可以通过 @EnableAspectJAutoProxy(proxyTargetClass = true) 强制启用 CGLIB,哪怕有接口也走子类代理。

JDK 动态代理是怎么工作的?

它依赖三个关键角色:

  • 目标对象:原始业务类(必须实现接口);
  • InvocationHandler:统一拦截逻辑的处理器,所有代理方法调用最终都落到它的 invoke() 方法;
  • Proxy.newProxyInstance():根据类加载器、接口列表和 handler 创建代理实例。

Spring 内部将切面(@Aspect)、切入点(@Pointcut)和通知(@Before/@After 等)组装成一个 ReflectiveMethodInvocation 链,由 DefaultAopProxyFactory 封装进 JDK 的 InvocationHandler 中。

CGLIB 代理的关键特点

CGLIB 不依赖接口,而是通过继承目标类生成子类(重写非 final 方法),因此:

Socratic Lab
Socratic Lab

一款AI办公效率工具,主要用于AI驱动的在线知识社区和AI知识搜索平台,适合需要提升相关任务效率的用户。

下载
  • 目标类不能是 final,方法也不能是 final 或 private(否则无法被子类覆盖);
  • 需要额外引入 cglib-nodep(Spring 5.0+ 已内置,无需手动添加);
  • 性能略高于 JDK 代理(尤其在大量代理场景),但启动稍慢(需生成字节码)。

通知执行顺序与增强链(Advice Chain)

多个通知(如 @Before + @Around + @AfterReturning)不是简单串行,而是按责任链模式组织:

  • @Around 可以控制是否执行目标方法(用 proceed());
  • @Before 在目标方法前执行,@After 在之后(无论是否异常);
  • @AfterReturning 仅在正常返回后触发,@AfterThrowing 仅在抛异常后触发;
  • 同类型通知可通过 @Order 或实现 Ordered 接口指定优先级。

Spring 把这些通知包装成 Advisor,再由 AdvisedSupport 统一管理并构建调用链。

基本上就这些。理解代理选型、拦截入口和通知生命周期,就能稳住 Spring AOP 的主干逻辑。实际开发中,多数问题出在代理失效(比如自调用、非 public 方法、final 类)——这些都不是 bug,而是代理机制本身的边界。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2025.08.06

2751

22

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

2026.01.26

497

25

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

40

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

40

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

80

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

80

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习