Spring AOP 实战指南:从入门到精通(4)

米饭5个月前行业资讯179

3.5 切点表达式:

上面的代码中,我们一直在使用切点表达式来描述切点。下面我们来介绍一下切点表达式的语法。


切点表达式常见有两种表达方式:


execution:根据方法的签名来匹配。

@annotation:根据注解匹配。

3.5.1 execution 表达式:

execution() 是最常用的切点表达式,用来匹配方法,语法为:

execution (<访问修饰符> <返回类型> <包名.类名.方法(方法参数)> <异常>)

其中:访问修饰符和异常可以省略。

image-20241011085755735

切点表达式支持通配符表达:


* :匹配任意字符,只匹配一个元素(返回类型,包,类名,方法或者方法参数)。

包名使用 * 表示任意包(一层包使用一个 * )。

类名使用 * 表示任意类。

返回值使用 * 表示任意返回值类型。

方法名使用 * 表示任意方法(参数可能有限制)。

参数使用 * 表示一个任意类型的参数。

..:匹配多个连续的任意符号,可以通配任意层级的包,或任意类型,任意个数的参数。

使用..配置包名,标识此包以及此包下的所有子包。

可以使用..配置参数,任意个任意类型的参数。

3.5.2 @annotation:

execution 表达式更适用有规则的,如果我们要匹配多个无规则的方法呢,比如:TestController 中的 t1() 和 UserController 中的 u1() 这两个方法。这个时候我们使用 execution 这种切点表达式来描述就不是很方便了。我们可以借助自定义注解的方式以及另一种切点表达式 @annotation 来描述这一类的切点。

实现步骤:

  1. 编写自定义注解。

  2. 使用 @annotation 表达式来描述切点。

  3. 在方法上添加自定义注解。

创建一个注解类(和创建 Class 文件一样的流程,选择 Annotation 就可以了)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAspect {
}

使用 @annotation 表达式来描述切点。

@Component
@Slf4j
@Aspect
public class MyAspectDemo {
    @Before("@annotation(com.example.demo.aspect.MyAspect)")
    public void doBefore(){
        log.info("我是 MyAspectDemo");
    }
}

在方法上添加自定义注解。

@RequestMapping("/test")
@RestController
@Slf4j
public class TestController {
    @MyAspect
    @RequestMapping("/t1")
    public void test1(){
        log.info("我是 test1");
    }
}

运行程序,访问 test1 方法。

f8486ecd3df1455bd629f1c2aa82d3ff.png

3.6 Spring AOP 的实现方式(常见面试题):

基于注解 @Aspect。


基于自定义注解(@annotation)。


基于 Spring API(通过 xml 配置的方式,自从 SpringBoot 广泛使用之后,这种方法几乎看不到了)。


基于代理来实现(更加久远的一种实现方式,写法笨重,不建议使用)。


本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  

云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ


相关文章

云端之上的边缘:解读云计算与边缘计算的战略融合

云端之上的边缘:解读云计算与边缘计算的战略融合

一、引言在当前的信息化和数字化浪潮中,云计算和边缘计算作为两种重要的计算模型,各自在不同的场景中发挥着不可替代的作用。它们不仅在概念、特点、应用场景上有所不同,而且在实际应用中常常相互协作,形成了一种...

运维初入门之认识运维,运维日常的工作都在干什么

运维初入门之认识运维,运维日常的工作都在干什么

运维是指系统运维,是指负责维护、管理和优化计算机系统和网络设备的工作。运维日常的工作主要包括系统监控、故障处理、性能调优、安全防护、备份和恢复、资源规划等多个方面。以下是对运维日常工作进行详细说明的2...

Gartner权威报告解读|应用可观测性列为2023年重要战略技术趋势!

Gartner于今日发布企业机构在2023年需要探索的十大战略技术趋势。Gartner杰出研究副总裁Frances Karamouzis表示:“为了在经济动荡时期增加企业机构的盈利,首席信息官和IT高...

docker配置国内镜像加速

docker配置国内镜像加速

docker配置国内镜像加速由于国内使用docker拉取镜像时,会经常出现连接超时的网络问题,所以配置Docker 加速来使用国内的镜像加速服务,以提高拉取 Docker 镜像的速度。1、备...

MyBatisPlus从零到一:快速入门与核心功能详解(5)

MyBatisPlus从零到一:快速入门与核心功能详解(5)

3.4 通用枚举:MybatisPlus 提供了一个处理枚举的类型转换器,可以帮我们把枚举类型与数据库类型自动转换。3.4.1 创建枚举对象并添加 @EnumValue 注解要让MybatisPlus...

Linux第一个小程序——进度条实现

Linux第一个小程序——进度条实现

前言我们之前学习过vim编辑器、gcc/g++的使用和make/makefile工具,所以今天我们就可以使用它们创建Linux上第一个小程序——进度条。在实现进度条之前我们首先需要补充两个小知识。1....

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。