【Spring AOP】_切点类的切点表达式

server/2025/3/6 6:00:47/

目录

1. 根据方法签名匹配编写切点表达式

1.1 具体语法

1.2 通配符表达规范

2. 根据注解匹配编写切点表达式

2.1 实现步骤

2.2 元注解及其常用取值含义

2.3 使用自定义注解

2.3.1 编写自定义注解@MyAspect

2.3.2 编写切面类MyAspectDemo

2.3.3 编写测试类及测试方法


在前文使用注解编写AOP程序时,对于每一个切面,都是由切点和通知构成。

对于切点,有两种方式可以指明需要功能增强的类或类的方法:

(1)直接使用@Around、@Before、@After、@AfterReturning、@AfterThrowing等注解直接指明需要功能增强的类或方法,形如:

java">@Around("execution(* com.example.bookmanagementsystem.controller.*.*(..))")

(2)通过@Pointcut注解指明公共切点,在其他通知前仍采取五个注解指明类或方法,但可通过@Pointcut标注的通知的方法名来简化编写,形如:

java"> @Pointcut("execution(* com.zhouyou.demos.controller.*.*(..))")public void pc(){ }@Around("pc()")

但对于方式1的每一种切点声明方式和方式2的@Pointcut声明切点方式,都是采用方法的签名来匹配。

实际上切点表达式有两种编写方式,可根据方法的签名匹配,也可根据注解匹配。

1. 根据方法签名匹配编写切点表达式

1.1 具体语法

1.2 通配符表达规范

1、*匹配诶任意字符,值匹配一个元素,包名使用*表示任意包,类名使用*表示任意类,返回值使用*表示任意返回值,方法名使用*表示任意方法,参数使用*表示一个任意类型的参数;

2、..匹配多个连续的任意符号。..配置包名表示此包及其所有子包,..配置参数表示任意个任意类型的参数;

如:

java">execution(* com.zhouyou.demos.controller.*.*(..)

表示controller包下所有的类的所有方法; 

2. 根据注解匹配编写切点表达式

除以上采用方法签名的方式外,还可以使用@annotation注解的方式编写切点表达式,这种方式通常应用在某个切面类需要匹配多个controller类中的部分方法的情况;

2.1 实现步骤

1、编写自定义注解;

2、使用@annotation表达式来描述切点;

3、在连接点的方法上添加自定义注解;

2.2 元注解及其常用取值含义

1. @Target:表示注解所修饰的对象范围:

2、@Retention:表示注解的生命周期:

2.3 使用自定义注解

2.3.1 编写自定义注解@MyAspect

在aspect包下创建MyAspect注解类:

在MyAspect类中使用元注解指明其修饰对象范围和生命周期:

java">package com.zhouyou.demos.aspect;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// 表示该注解用于标注方法
@Target(ElementType.METHOD)
// 表示该注解声明周期在程序执行时有效
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAspect {
}

2.3.2 编写切面类MyAspectDemo

java">package com.zhouyou.demos.aspect;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Aspect
@Component
@Slf4j
public class MyAspectDemo {@Before("@annotation(com.zhouyou.demos.aspect.MyAspect)")public void doBefore(){log.info("MyAspectDemo doBefore");}@After("@annotation(com.zhouyou.demos.aspect.MyAspect)")public void doAfter(){log.info("MyAspectDemo doAfter");}
}

2.3.3 编写测试类及测试方法

在controller包下创建TestCotroller1和TestController2两个测试类,分别设置3个和2个不同返回值的测试方法,并在TestController1的test12方法和TestController2的test22方法前增加自定义的@MyAspect注解。

1. TestController1:

java">package com.zhouyou.demos.controller;import com.zhouyou.demos.aspect.MyAspect;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test1")
public class TestController1 {@RequestMapping("/test11")public String test11(){return "aop";}@MyAspect@RequestMapping("/test12")public Integer test12(){return 12;}@RequestMapping("/test13")public boolean test13(){return true;}
}

2. TestController2:

java">package com.zhouyou.demos.controller;import com.zhouyou.demos.aspect.MyAspect;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test2")
public class TestController2 {@RequestMapping("/test21")public String test21(){return "hello";}@MyAspect@RequestMapping("/test22")public Integer test22(){return 22;}
}

启动项目,依次按顺序访问test1/test11至test1/test13,和test2/test21、test2/test22,控制台日志如下:

只有添加了自定义注解@MyAspect修饰的TestController1的test12方法和TestController2的test22方法执行时,切面通知doBefore和doAfter执行,访问其余方法时,切面通知均未执行。


http://www.ppmy.cn/server/172803.html

相关文章

Python的枚举enumerate学习

这个enumerate可以说是非常常用和强大的一个东西,值得单独盘点学习复习一下。 关键语法拆解 for i, (doc, meta, doc_id) in enumerate(zip(docs, metas, ids)):# 处理每个元素的代码1️⃣ zip(docs, metas, ids) 功能:将3个列表逐元素打包成元组示例…

LC串联带初始值的时域表达式

LC串联,在t0时刻接入直流电压 U i n U_{in} Uin​。 电感电流 i ( t ) i(t) i(t)和电容电压 u c ( t ) u_c(t) uc​(t)的时域表达式可通过二阶微分方程求解。以下是推导过程与结果: 1. 微分方程建立 电感 L L L与电容 C C C串联,接入直流…

如何为 Power Automate 配置 Azure Key Vault 权限

前言 最近,在Power Automate中使用Azure Key Vault,然后,就需要配置一下AKV的权限。 正文 1.我们在Azure Portal里新建一个Key vault,如下图: 2.进入Access policies,点击Create,如下图&#xf…

网上花店微信小程序+论文源码调试讲解

第四章 系统设计 4.1 总体功能 网上花店微信小程序是根据需求定制开发,开发软件选用IDEA平台配合MySQL数据库进行开发环境的搭建操作,网站采用WEB应用程序中最流行的小程序结构进行开发,用户访问系统数据仅仅需要在客户端安装谷歌浏览器或者…

Hi3516CV610电瓶车检测 电动自行车检测 人脸检测 人形检测 车辆检测 宠物检测 包裹检测 源码

海思全线一代AI摄像机SoC,在板端实现实时AI检测,视频传输、视频录像、报警等功能 Hi3516CV610开发板实时AI检测效果演示,实时在板端完成 视频采集—AI检测—视频编码—网络传输,AI检测算法无需license无需授权,终身免…

SQL经典常用查询语句

1. 基础查询语句 1.1 查询表中所有数据 在SQL中,查询表中所有数据是最基本的操作之一。通过使用SELECT * FROM table_name;语句,可以获取指定表中的所有记录和列。例如,假设有一个名为employees的表,包含员工的基本信息&#xf…

任务9:交换机基础及配置

CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog 一、交换机基础 交换机的概念:交换机是一种网络设备,用于连接多台计算机或网络设备,实现数据包在局域网内的快速交换。交换机基于MAC地址来转发数据包&#x…

Airflow和PySPARK实现带多组参数和标签的Amazon Redshift数据仓库批量数据导出程序

设计一个基于多个带标签SQL模板作为配置文件和多组参数的PySPARK代码程序,实现根据不同的输入参数,用Airflow进行调度,自动批量地将Amazon Redshift数据仓库的数据导出为Parquet、CSV和Excel文件到S3上,标签和多个参数&#xff08…