Spring - AOP 源码阅读笔记 : 基础概念

in Tech Java

前言

本篇文章主要介绍 AOP 相关概念及核心流程。

简介

AOP(Aspect Oriented Programming) 面向切面编程。是一种可以实现在不修改源代码的情况下,给程序动态统一添加某种特定功能的技术。

Aspect

由一系列 Pointcut、Advice 组成的模块对象。

Join point

在程序执行过程中的一点,例如方法的执行或异常的处理。AOP 中的 Joinpoint 可以有许多类型,如构造方法调用、字段的设置及获取、方法执行等。但在 Spring AOP 中,连接点始终表示方法的执行。

Pointcut

切点就是匹配到的连接点。

Advice

切面在匹配到的连接点处采取的操作。

Before advice

在连接点之前运行,但是它不能阻止执行流程继续进行到连接点(除非它引发异常)。

After returning advice

在连接点正常完成之后运行(例如,如果方法返回而没有引发异常)。

After throwing advice

如果方法因引发异常而退出,则运行。

After (finally) advice

无论连接点退出是否异常,均运行。

Around advice

可以在方法调用之前和之后执行自定义行为。包含上述几种 advice 行为。

Weaving

将切面织入目标对象有三种方式:

编译期:在编译时,由编译器把切面调用编译进字节码,这种方式需要定义新的关键字并扩展编译器,AspectJ 就扩展了 Java 编译器,使用关键字 aspect 来实现织入;

加载期:在目标类被装载到 JVM 时,通过一个特殊的类加载器,对目标类的字节码重新“增强”;

运行期:目标对象和切面都是普通 Java 类,通过动态代理功能或者第三方库实现运行期动态织入。

最简单的方式是第三种,Spring AOP 实现就是基于动态代理。由于动态代理要求必须实现接口,如果一个普通类没有业务接口,就需要通过 CGLIB 或者 Javassist 这些第三方库实现。注:最新版 Spring Boot 中默认,接口类型用JDK动态代理,类类型用 CGLIB。

AOP 本质就是代理,编译期和加载期的织入可以看做静态代理,运行期则是动态代理。

常见应用场景:权限检查、日志、事务等。

核心流程

这里以目前最流行的 SpringBoot 方式来讲。