|
@@ -0,0 +1,142 @@
|
|
|
|
+## 环境信息
|
|
|
|
+
|
|
|
|
+### Maven 依赖
|
|
|
|
+
|
|
|
|
+```xml
|
|
|
|
+<dependency>
|
|
|
|
+ <groupId>org.springframework</groupId>
|
|
|
|
+ <artifactId>spring-aop</artifactId>
|
|
|
|
+ <version>5.2.2.RELEASE</version>
|
|
|
|
+</dependency>
|
|
|
|
+
|
|
|
|
+<dependency>
|
|
|
|
+ <groupId>org.aspectj</groupId>
|
|
|
|
+ <artifactId>aspectjweaver</artifactId>
|
|
|
|
+ <version>1.9.6</version>
|
|
|
|
+</dependency>
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+## 思维导图
|
|
|
|
+
|
|
|
|
+![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 自动代理:`<aop:aspectj-autoproxy/>`
|
|
|
|
+ - 配置:`<aop:config/>`
|
|
|
|
+ - Aspect : `<aop:aspect/>`
|
|
|
|
+ - Pointcut :`<aop:pointcut/>`
|
|
|
|
+ - Advice :`<aop:around/>` 、`<aop:before/>` 、`<aop:after-returning/>` 、`<aop:after-throwing/>` 和 `<aop:after/>`
|
|
|
|
+ - Introduction :`<aop:declare-parents/>`
|
|
|
|
+ - 代理 Scope : `<aop:scoped-proxy/>`
|
|
|
|
+
|
|
|
|
+#### 底层 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 适配实现
|