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

news2025/3/6 13:40:04

目录

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等注解直接指明需要功能增强的类或方法,形如:

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

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

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

    @Around("pc()")

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

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

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

1.1 具体语法

1.2 通配符表达规范

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

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

如:

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类中使用元注解指明其修饰对象范围和生命周期:

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

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:

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:

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.coloradmin.cn/o/2310548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初次使用 IDE 搭配 Lombok 注解的配置

前言 在 Java 开发的漫漫征程中,我们总会遇到各种提升效率的工具。Lombok 便是其中一款能让代码编写变得更加简洁高效的神奇库。它通过注解的方式,巧妙地在编译阶段为我们生成那些繁琐的样板代码,比如 getter、setter、构造函数等。然而&…

关于 QPalette设置按钮背景未显示出来 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/146047054 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

mysql下载与安装

一、mysql下载: MySQL获取: 官网:www.mysql.com 也可以从Oracle官方进入:https://www.oracle.com/ 下载地址:https://downloads.mysql.com/archives/community/ 选择对应的版本和对应的操作系统&#xff…

Python练习(握手问题,进制转换,日期问题,位运算,求和)

一. 握手问题 代码实现 ans0for i in range(1,51):for j in range(i1,51):if i<7 and j<7:continueelse:ans 1print(ans) 这道题可以看成是50个人都握了手减去7个人没握手的次数 答案&#xff1a;1204 二.将十进制整数拆解 2.1门牌制作 代码实现 ans0for i in ra…

小程序分类页面

1创建cate分支 2.cate滑动界面布局 获取滑动界面高度 3.获取并渲染一级分类的列表数据 4.渲染二级和三级分类列表 获取二级列表的数据 5.渲染二级分类列表的UI结构 6.动态渲染三级分类列表

HTML + CSS 题目

1.说说你对盒子模型的理解? 一、是什么 对一个文档进行布局的时候&#xff0c;浏览器渲染引擎会根据标准之一的css基础盒模型&#xff0c;将所有元素表示为一个个矩形的盒子。 一个盒子由四个部分组成: content&#xff0c;padding&#xff0c;border&#xff0c;margin 下…

计算机视觉|ViT详解:打破视觉与语言界限

一、ViT 的诞生背景 在计算机视觉领域的发展中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;一直占据重要地位。自 2012 年 AlexNet 在 ImageNet 大赛中取得优异成绩后&#xff0c;CNN 在图像分类任务中显示出强大能力。随后&#xff0c;VGG、ResNet 等深度网络架构不…

Node JS 调用模型Xenova_all-MiniLM-L6-v2实战

本篇通过将句子数组转换为句子的向量表示&#xff0c;并通过平均池化和归一化处理&#xff0c;生成适合机器学习或深度学习任务使用的特征向量为例&#xff0c;演示通过NodeJS 的方式调用Xenova/all-MiniLM-L6-v2 的过程。 关于 all-MiniLM-L6-v2 的介绍&#xff0c;可以参照上…

ASP.NET Core JWT认证与授权

1.JWT结构 JSON Web Token&#xff08;JWT&#xff09;是一种用于在网络应用之间安全传输声明的开放标准&#xff08;RFC 7519&#xff09;。它通常由三部分组成&#xff0c;以紧凑的字符串形式表示&#xff0c;在身份验证、信息交换等场景中广泛应用。 2.JWT权限认证 2.1添…

【车规芯片】如何引导时钟树生长方向

12nm车规DFTAPR项目中&#xff0c;我们可以看到&#xff0c;绝大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1这个mux&#xff0c;这是我们DFT设计结果&#xff1a; 这里我们重新打开place的数据 Anchor&#xff0c;也就…

《深度学习实战》第11集:AI大模型压缩与加速

深度学习实战 | 第11集&#xff1a;AI大模型压缩与加速 在深度学习领域&#xff0c;随着模型规模的不断增大&#xff0c;模型的推理速度和部署效率成为实际应用中的关键挑战。本篇博客将带你深入了解模型压缩与加速的核心技术&#xff0c;并通过一个实战项目展示如何使用知识蒸…

大语言模型中温度参数(Temperature)的核心原理

大语言模型中温度参数&#xff08;Temperature&#xff09;的核心原理是通过调整模型输出的概率分布&#xff0c;控制生成结果的随机性和多样性。以下是其原理的详细说明&#xff1a; 一、定义与核心作用 温度参数是生成式模型&#xff08;如GPT系列&#xff09;中的一个超参数…

K8s控制器Deployment详解

回顾 ReplicaSet 控制器,该控制器是用来维护集群中运行的 Pod 数量的&#xff0c;但是往往在实际操作的时候&#xff0c;我们反而不会去直接使用 RS&#xff0c;而是会使用更上层的控制器&#xff0c;比如说 Deployment。 Deployment 一个非常重要的功能就是实现了 Pod 的滚动…

鸿蒙HarmonyOS评论功能小demo

评论页面小demo 效果展示 1.拆解组件&#xff0c;分层搭建 我们将整个评论页面拆解为三个组件&#xff0c;分别是头部导航&#xff0c;评论项&#xff0c;回复三个部分&#xff0c;然后统一在index界面导入 2.头部导航界面搭建 Preview Component struct HmNavBar {// 属性&a…

基于PyTorch的深度学习3——基于autograd的反向传播

反向传播&#xff0c;可以理解为函数关系的反向传播。

打印三角形及Debug

打印三角形及Debug package struct; ​ public class TestDemo01 {public static void main(String[] args) {//打印三角形 五行 ​for (int i 1; i < 5; i) {for (int j 5 ; j >i; j--) {System.out.print(" ");}for (int k1;k<i;k) {System.out.print(&…

大语言模型揭秘:从诞生到智能

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;无疑是技术领域最耀眼的明星之一。它们不仅能够理解人类的自然语言&#xff0c;还能生成流畅的文本&#xff0c;甚至在对话、翻译、创作等任务中表现出接近人类的智能…

Collab-Overcooked:专注于多智能体协作的语言模型基准测试平台

2025-02-27&#xff0c;由北京邮电大学和理想汽车公司联合创建。该平台基于《Overcooked-AI》游戏环境&#xff0c;设计了更具挑战性和实用性的交互任务&#xff0c;目的通过自然语言沟通促进多智能体协作。 一、研究背景 近年来&#xff0c;基于大型语言模型的智能体系统在复…

SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试(WebSocket连接模式)

文章目录 前言正文一、项目环境二、项目代码2.1 pom.xml2.2 DeepSeekController.java2.3 启动类2.4 logback-spring.xml2.5 application.yaml2.6 WebsocketConfig.java2.7 AiChatWebSocketHandler.java2.8 SaveChatSessionParamRequest.java2.9 index.html 三、页面调试3.1 主页…

LINUX网络基础 [一] - 初识网络,理解网络协议

目录 前言 一. 计算机网络背景 1.1 发展历程 1.1.1 独立模式 1.1.2 网络互联 1.1.3 局域网LAN 1.1.4 广域网WAN 1.2 总结 二. "协议" 2.1 什么是协议 2.2 网络协议的理解 2.3 网络协议的分层结构 三. OSI七层模型&#xff08;理论标准&#xff09; …