## 环境信息 ### 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 适配实现