# 《Spring核心技术》第24章:深度解析切入点表达式

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-22 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~


  • 本章难度:★★★★☆

  • 本章重点:从源码级别彻底掌握解析切入点表达式在Spring底层的执行流程。


本章目录如下所示:

  • 学习指引
  • 切入点表达式概述
    • 基本概念
    • 分类
    • 关键字
    • 通配符
    • 逻辑条件
  • 源码时序图
  • 源码解析
  • 总结
  • 思考
  • VIP服务

# 一、学习指引

AOP的切入点表达式,你真的彻底了解过吗?

切入点表达式,简单点来讲就是一种遵循特定语法,用于捕获每一个种类的可使用连接点的语法,Spring中的AOP特性支持切入点表达式,对于这种切入点表达式和其在Spring底层的执行流程,你真的彻底掌握了吗?

注意:本章会以第22章的案例程序为基础解析切入点表达式的源码时序图和源码执行流程。

# 二、切入点表达式概述

先简单介绍下切入点表达式吧?

本节,主要从切入点表达式的基本概念、分类、关键字、通配符和逻辑条件等方面进行简单的介绍。

# 2.1 基本概念

切入点表达式一般指的是一种遵循特定语法,用于捕获每一个种类的可使用连接点的语法,并且能够对符合语法格式的连接点进行功能增强。

# 2.2 分类

切入点表达式可以按照用途分成如下种类。

方法执行:execution(MethodSignature)
方法调用:call(MethodSignature)
构造器执行:execution(ConstructorSignature)
构造器调用:call(ConstructorSignature)
类初始化:staticinitialization(TypeSignature)
属性读操作:get(FieldSignature)
属性写操作:set(FieldSignature)
例外处理执行:handler(TypeSignature)
对象初始化:initialization(ConstructorSignature)
对象预先初始化:preinitialization(ConstructorSignature)
1
2
3
4
5
6
7
8
9
10

# 2.3 关键字

Spring支持的AspectJ切入点关键字如下所示:

execution:用于匹配方法执行的连接点
within:用于匹配指定类型内的方法执行
this:用于匹配当前AOP代理对象类型的执行方法注意是AOP代理对象的类型匹配,这样就可能包括引入接口类型匹配
target:用于匹配当前目标对象类型的执行方法注意是目标对象的类型匹配,这样就不包括引入接口类型匹配
args:用于匹配当前执行的方法传入的参数为指定类型的执行方法
@within:用于匹配所以持有指定注解类型内的方法
@target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解
@args:用于匹配当前执行的方法传入的参数,持有指定的注解
@annotation:用于匹配当前持有指定注解的执行方法
bean:Spring AOP扩展的,AspectJ没有此指示符,用于匹配特定名称的Bean对象的执行方法
reference pointcut:表示引用其他命名的切入点,只有@ApectJ风格支持,Schema风格不支持。
1
2
3
4
5
6
7
8
9
10
11

# 2.4 通配符

Spring支持的切入点表达式的通配符如下所示。

*:匹配任何数量字符;
..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数。
+:匹配指定类型的子类型;仅能作为后缀放在类型模式后边。
java.lang.String 匹配String类型;
java.*.String 匹配java包下的任何“一级子包”下的String类型;如匹配java.lang.String,但不匹配java.lang.ss.String
java..* 匹配java包及任何子包下的任何类型;如匹配java.lang.Stringjava.lang.annotation.Annotation
java.lang.*ing 匹配任何java.lang包下的以ing结尾的类型;如匹配java.lang.bingheing
java.lang.Number+ 匹配java.lang包下的任何Number的子类型;如匹配java.lang.Integer,也匹配java.math.BigInteger
1
2
3
4
5
6
7
8

# 2.5 逻辑条件

Spring支持的切入点表达式的逻辑条件如下所示。

&& and
|| or
! not
1
2
3

# 三、源码时序图

结合时序图理解源码会事半功倍,你觉得呢?

本节,就简单介绍下解析切入点表达式在Spring底层执行的源码时序图。解析切入点表达式在Spring底层执行的源码时序图如图24-1~24-4所示。

图24-1

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码