文章目录
- 概述
- 一、模块概览与项目结构
- 1.1 源码目录全景
- 二、构建配置与依赖关系
- 2.1 Gradle构建文件
- 2.2 关键依赖解读
- 三、核心概念体系(接口层)
- 3.1 Pointcut — 切点
- 3.2 ClassFilter — 类过滤器
- 3.3 MethodMatcher — 方法匹配器
- 3.4 Advice — 通知(AOP Alliance兼容)
- 四、Advice通知机制详解
- 4.1 MethodBeforeAdvice — 方法前置通知
- 4.2 AfterReturningAdvice — 返回后通知
- 4.3 ThrowsAdvice — 异常通知
- 4.4 MethodInterceptor — 环绕通知(AOP Alliance标准)
- 五、Pointcut切点匹配系统
- 5.1 NameMatchMethodPointcut — 方法名匹配切点
- 5.2 StaticMethodMatcherPointcut — 静态方法匹配切点基类
- 5.3 AspectJExpressionPointcut — AspectJ表达式切点
- 六、Advisor顾问器模式
- 6.1 Advisor接口
- 6.2 PointcutAdvisor — 带切点的顾问器
- 6.3 DefaultPointcutAdvisor — 默认切点顾问器(最常用)
- 6.4 IntroductionAdvisor — 引入型顾问器
- 七、代理工厂框架(Framework层)
- 7.1 ProxyConfig — 代理配置基类
- 7.2 AdvisedSupport — 配置管理基类
- 7.3 ProxyFactory — 代理工厂(编程式使用的核心入口)
- 7.4 Advised接口 — 可操作的代理配置
- 八、代理实现:JDK动态代理 vs CGLIB
- 8.1 AopProxy接口
- 8.2 DefaultAopProxyFactory — 代理选择策略
- 8.3 JdkDynamicAopProxy — JDK动态代理实现
- 8.4 CglibAopProxy — CGLIB代理实现
- 九、目标源(TargetSource)体系
- 9.1 TargetSource接口
- 9.2 SingletonTargetSource — 单例目标源(默认)
- 9.3 其他TargetSource实现
- 十、AspectJ集成
- 10.1 AspectJExpressionPointcut详细解析
- 10.2 ajc编译检测
- 十一、适配器模式(Adapter)
- 11.1 GlobalAdvisorAdapterRegistry — 全局适配器注册表
- 11.2 适配器的作用
- 十二、工具类与实用方法
- 12.1 AopUtils — AOP工具类
- 12.2 ExposeInvocationInterceptor — 暴露当前调用上下文
- 十三、完整使用示例(17个实战案例)
- 13.1 基础代理创建(示例1-6)
- 13.2 Advisor管理(示例7-9)
- 13.3 引入(Introduction)示例(示例10)
- 13.4 MethodInterceptor环绕通知示例(示例11)
- 13.5 MethodBeforeAdvice前置通知示例(示例12)
- 13.6 AfterReturningAdvice后置通知示例(示例13)
- 13.7 ThrowsAdvice异常通知示例(示例14)
- 13.8 组合使用Pointcut + Advice(示例15)
- 13.9 AspectJ表达式切点(示例16)
- 13.10 运行时操作已创建的代理(示例17)
- 十四、最佳实践与常见问题解答
- 14.1 代理类型选择指南
- 14.2 性能优化建议
- 14.3 常见问题解答(FAQ)
- 14.4 设计原则(来自源码注释提炼)
- 十五、架构图与类关系总结
- 15.1 核心接口层次
- 15.2 Pointcut组合结构
- 15.3 代理创建流程
- 15.4 方法调用拦截链
- 15.5 模块依赖关系全景
- 总结
- 附录与参考资源
- 附录A:关键API速查表
- 附录B:版本历史与演进
概述
在日常Java开发中,我们经常会遇到这样的需求:对业务方法添加日志记录、性能监控、事务管理、权限校验等横切关注点(Cross-Cutting Concerns)。传统做法是在每个需要的方法中手动添加这些代码,结果就是代码重复、维护困难、业务逻辑与非业务逻辑耦合。
Spring AOP(Aspect-Oriented Programming,面向切面编程)正是为了解决这类问题而设计的。作为Spring Framework的核心模块之一,它提供了一种在不修改源代码的情况下,对业务逻辑进行横切关注点增强的能力。
本文将通过源码分析+实战示例的方式,带你彻底掌握Spring AOP的每一个核心概念和实现细节。
一、模块概览与项目结构
1.1 源码目录全景
Spring AOP模块完整的源码目录结构如下:
spring-aop/ ├── spring-aop.gradle # Gradle构建配置 └── src/ ├── main/ │ ├── java/org/springframework/aop/ # 核心API包 │ │ ├── Advisor.java # 顾问器接口 │ │ ├── Pointcut.java # 切点抽象 │ │ ├── ClassFilter.java