## 环境信息
### Maven 依赖
```xml
org.springframework
spring-aop
5.2.2.RELEASE
org.aspectj
aspectjweaver
1.9.6
```
## 思维导图
![img](assets/o_210930100537Spring AOP 核心类.png)
## 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 适配实现