别只会用 AOP!源码级深度解析核心接口与代理机制,一次性吃透底层原理

📅 2026/7/9 19:55:25 👁️ 阅读次数 📝 编程学习
别只会用 AOP!源码级深度解析核心接口与代理机制,一次性吃透底层原理

文章目录

    • 概述
    • 一、模块概览与项目结构
      • 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