环境信息
Maven 依赖
<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>
思维导图
Spring AOP 总览
AOP 引入
Java OOP 存在哪些局限性?
- 静态化语言:类结构一旦定义,不容易被修改
- 侵入性扩展:通过继承和组合组织新的类结构
AOP 常见使用场景
- 日志场景
- 诊断上下文,如:Log4j 或 Logback 中的 _x0008_MDC
- 辅助信息,如:方法执行时间
- 统计场景
- 统计场景
- 性能场景
Java AOP 设计模式
- 代理模式:静态和动态代理
- 判断模式:类、方法、注解、参数、异常...
- 拦截模式:前置、后置、返回、异常
Java AOP 代理模式(Proxy)
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)
- 异常(Exception)
Spring AOP 代理实现
- JDK 动态代理实现 - 基于接口代理
- CGLIB 动态代理实现 - 基于类代理(字节码提升)
- AspectJ 适配实现