## 环境信息
### Maven 依赖
```xml
    org.springframework
    spring-aop
    5.2.2.RELEASE
    org.aspectj
    aspectjweaver
    1.9.6
```
## 思维导图

## Spring AOP 总览
### AOP 引入
Java OOP 存在哪些局限性?
- 静态化语言:类结构一旦定义,不容易被修改
- 侵入性扩展:通过继承和组合组织新的类结构
### AOP 常见使用场景
- 日志场景
- 诊断上下文,如:Log4j 或 Logback 中的 _x0008_MDC
- 辅助信息,如:方法执行时间
- 统计场景
  - 方法调用次数
  - 执行异常次数
  - 数据抽样
  - 数值累加
- 统计场景
  - 方法调用次数
  - 执行异常次数
  - 数据抽样
  - 数值累加
- 性能场景
  - 缓存,如 Spring Cache
  - 超时控制
### Java AOP 设计模式
- 代理模式:静态和动态代理
- 判断模式:类、方法、注解、参数、异常...
- 拦截模式:前置、后置、返回、异常
#### Java AOP 代理模式(Proxy)
- Java 静态代理
  - 常用 OOP 继承和组合相结合
- Java 动态代理
  - JDK 动态代理
  - 字节码提升,如 CGLIB
#### Java AOP 判断模式(Predicate)
判断来源
- 类型(Class)
- 方法(Method)
- 注解(Annotation)
- 参数(Parameter)
- 异常(Exception)
#### Java AOP 拦截器模式(Interceptor)
拦截类型:
- 前置拦截(Before)
- 后置拦截(After)
- 异常拦截(Exception)
### Spring AOP 功能概述
核心特性:
- 纯 Java 实现、无编译时特殊处理、不修改和控制 ClassLoader
- **仅支持方法级别的 Join Points**
- **非完整 AOP 实现框架**
- **Spring IoC 容器整合**
- AspectJ 注解驱动整合(非竞争关系)
### Spring AOP 编程模型
#### 注解驱动
- 实现:Enable 模块驱动,`@EnableAspectJAutoProxy`
- 注解:
  - 激活 AspectJ 自动代理:`@EnableAspectJAutoProxy`
  - Aspect : `@Aspect`
  - Pointcut :`@Pointcut`
  - Advice :`@Before` 、`@AfterReturning` 、`@AfterThrowing` 、`@After` 、`@Around`
  - Introduction :`@DeclareParents`
#### XML 配置驱动
- 实现:Spring Extendable XML Authoring
- XML 元素
  - 激活 AspectJ 自动代理:``
  - 配置:``
  - Aspect : ``
  - Pointcut :``
  - Advice :`` 、`` 、`` 、`` 和 ``
  - Introduction :``
  - 代理 Scope : ``
#### 底层 API
- 实现:JDK 动态代理、CGLIB 以及 AspectJ
- API:
  - 代理:`AopProxy`
  - 配置:`ProxyConfig`
  - Join Point:`Joinpoint`
  - Pointcut :`Pointcut`
  - Advice :`Advice`、`BeforeAdvice`、`AfterAdvice`、`AfterReturningAdvice`、`ThrowsAdvice`
### Spring AOP Advice 类型
Advice 类型:
- 环绕(Around)
- 前置(Before)
- 后置(After)
  - 方法执行
  - finally 执行
- 异常(Exception)
### Spring AOP 代理实现
- JDK 动态代理实现 - 基于接口代理
- CGLIB 动态代理实现 - 基于类代理(字节码提升)
- AspectJ 适配实现