当前位置: 首页 > news >正文

【Spring】AOP——通知(Advice)

1、通知(Advice)

1.1简介

  • 在AOP中,通知(Advice)是切面(Aspect)中的一部分,用于定义在连接点(Joinpoint)处应该执行的操作。
  • 通知类型可以在AOP框架中配置和使用,以便在运行时动态地将代码切入到类的指定方法、指定位置上。
  • 通过AOP,开发人员可以将日志记录、性能统计、安全控制、事务处理等代码从业务逻辑代码中划分出来,并独立到非指导业务逻辑的方法中,从而提高程序的可重用性和开发效率。

1.2常见的通知类型

  • 前置通知(Before Advice):在目标方法执行之前执行的通知,无法阻止方法的继续执行(除非它抛出一个异常)。
  • 后置通知(After Returning Advice):在目标方法成功执行之后执行的通知。如果目标方法通过抛出异常退出,则不会执行此类型的通知。
  • 异常通知(After Throwing Advice):在目标方法通过抛出异常退出时执行的通知。通常用于记录异常信息或进行异常处理。
  • 最终通知(After (finally) Advice):无论目标方法通过何种方式退出(正常返回或异常退出),该通知都会执行。它类似于Java语言中的finally块。
  • 环绕通知(Around Advice):环绕通知是最强大的通知类型,它将目标方法封装起来,可以在方法调用之前和之后自定义行为,甚至可以完全控制是否调用目标方法。环绕通知可以手动调用切入点方法并对其进行增强,从而实现更复杂的逻辑处理。

2、代码举例

在Spring AOP中,我们通常使用AspectJ的注解来定义通知。以下是用Spring AOP和AspectJ注解方式示范五种通知类型的示例代码:

首先,我们需要一个目标接口和一个实现类:

// 目标接口  
public interface MyService {  void doSomething();  void doSomethingElse() throws Exception;  
}  // 目标接口实现类  
@Service  
public class MyServiceImpl implements MyService {  @Override  public void doSomething() {  System.out.println("Doing something...");  }  @Override  public void doSomethingElse() throws Exception {  System.out.println("Doing something else...");  throw new Exception("An exception occurred!");  }  
}

创建一个切面类,并使用AspectJ的注解来定义五种通知:

@Aspect  
@Component  
public class MyAspect {  // 前置通知  @Before("execution(* com.example.demo.MyService.doSomething(..))")  public void beforeAdvice() {  System.out.println("Before doSomething is executed.");  }  // 后置通知(返回后)  @AfterReturning(pointcut = "execution(* com.example.demo.MyService.doSomething(..))", returning = "result")  public void afterReturningAdvice(JoinPoint joinPoint, Object result) {  System.out.println("After doSomething is executed. Result: " + result);  // 注意:这里result参数只有在目标方法有返回值时才有意义  }  // 异常通知  @AfterThrowing(pointcut = "execution(* com.example.demo.MyService.doSomethingElse(..))", throwing = "ex")  public void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) {  System.out.println("Exception occurred in doSomethingElse: " + ex.getMessage());  }  // 最终通知(无论成功还是异常)  @After("execution(* com.example.demo.MyService.*(..))")  public void afterAdvice(JoinPoint joinPoint) {  System.out.println("After method is executed: " + joinPoint.getSignature().getName());  }  // 环绕通知  @Around("execution(* com.example.demo.MyService.doSomething(..))")  public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {  System.out.println("Before doSomething is executed (around advice).");  Object result = joinPoint.proceed(); // 调用目标方法  System.out.println("After doSomething is executed (around advice). Result: " + result);  return result;  }  
}

在Spring配置中启用AspectJ自动代理,通过@EnableAspectJAutoProxy注解在配置类上完成:

@Configuration  
@EnableAspectJAutoProxy  
public class AppConfig {  // ... 其他配置 ...  
}

 

相关文章:

【Spring】AOP——通知(Advice)

1、通知(Advice) 1.1简介 在AOP中,通知(Advice)是切面(Aspect)中的一部分,用于定义在连接点(Joinpoint)处应该执行的操作。通知类型可以在AOP框架中配置和使…...

python中的一些基础概念

在python中整型数据可以和浮点型数据相加,在python中字符串数据可以进行相加, 在python中整型数据可以和布尔类型进行算术运算。此时True当做1,False当做0但是这样的操作是没有意义的, python中只有字符串类型没有字符类型&…...

8.Redis之hash类型

1.hash类型的基本介绍 哈希表[之前学过的所有数据结构中,最最重要的] 1.日常开发中,出场频率非常高. 2.面试中,非常重要的考点, Redis 自身已经是键值对结构了Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中…...

Edge浏览器

微软 Edge 是由微软开发的网络浏览器,它是 Windows 10 操作系统的默认浏览器,取代了之前的 Internet Explorer。Edge 浏览器在设计上注重性能、安全性和易用性,同时也提供了许多实用的功能,如内置笔记、阅读视图、集成的语音助手等…...

springboot项目中图片上传之后需要重启工程才能看到图片?

需求背景 最近在做一个用户自定义上传头像的小需求,用户上传头像然后需要立马回显。 需求是很常见的、正当的需求。如果不使用到对象存储这类服务,我们把用户头像的图片文件仅存在本地就可以了。我们在开发的过程中为了工程管理方便通常下意识会将图片…...

打卡信奥刷题(20)用Scratch图形化工具信奥B3756 [信息与未来 2021] 幸运数字

本题的基础是进制转换,关于2进制转换可以参考打卡信奥刷题(19)用Scratch图形化工具信奥B3972 [语言月赛 202405] 二进制 题解 知道了2进制,来实现5进制、7进制、9进制是一样的。 [信息与未来 2021] 幸运数字 题目描述 如果⼀个…...

Stream流模式通信及示例

Stream流模式通信是指在计算机网络中,数据作为连续的字节流传输而不是独立的数据包。它是一种面向连接的通信方式,常见于TCP(传输控制协议)。以下是Stream流模式通信的基本概念和一个简单的示例。 基本概念 面向连接&#xff1…...

从0开始学统计-t分布

1.t分布是如何被发现的? t分布最早由英国统计学家威廉塞弗顿(William Sealy Gosset)在1908年提出。塞弗顿是爱尔兰的一名酿酒厂的统计学家,他的工作需要对小样本数据进行分析。由于当时样本量较小(通常小于30&#xf…...

Git总结超全版

最近想系统的回顾一下Git的使用,如果只想快速的集成git到idea,可以参考另一篇我的博客中的git部分 目录 版本管理工具简介Git安装与配置Git远程仓库配置 Git常用命令为常用命令配置别名(可选)Git忽略文件.gitignore一些概念*本地仓库操作删除仓库内容 *远…...

网络安全之安全协议浅谈

安全协议 安全协议概述安全协议分类IPSecIPSec安全协议IPSec架构IPSec封装模式AH协议ESP协议SET协议SET协议电子交易模型SET协议安全目标认证中心CA 安全协议概述 安全协议是信息交换安全的核心,它在网络不同层次上、针对不同应用,通过对各种密码学技术…...

华为云部署前端项目发生的事

今天刚买了一个云服务,想着部署一下前端项目: 使用的是 docker nginx 部署 部署方法,在以往的文章中有介绍,如有兴趣可以看看docker 部署; 结果发现部署成功之后,竟然无法访问,从命令来看&…...

需求:实现一个可以统计代码的运行时间

需求:有一个做加法计算的函数,要统计执行这个加法函数代码运行了多久 import timedef add(a, b):time.sleep(1)return a bst time.time() add(100, 200) et time.time() print("该函数运行时间为:", et - st) 学了闭包&#x…...

软考高级之redis中使用zset实现延迟队列,你答对了么?

实现延迟队列的思路 zset的特性,带有分数的排序,以时间戳作为分数进行排序 添加任务 zdd取出任务 zrangbyscore执行任务 zrem 定时任务 public static void main(String[] args) {Jedis jedis new Jedis("ip", 6379);TimerTask task new …...

CS 下载安装详解

目录 CS简介: CS下载地址: CS的安装: CS简介: CS为目前渗透中常用的一款工具,它的强大在于控制windows木马,CS主要控制windows木马。 CS下载地址: 链接:https://pan.baidu.com/…...

前端canvas项目实战——在线图文编辑器(十):小地图MiniMap(上)

目录 前言一、 效果展示二、 实现步骤0. 行动前的思考1. 为小地图更新「背景图」2. 为小地图更新「滑动窗口」2.1 获取新的滑动窗口「宽高」2.2 获取新的滑动窗口「位置」3. 为小地图更新「遮罩」后记前言 上一篇博文中,我们引入了「逻辑画布」的概念,让整个工具的页面看起来…...

linux的chmod的数字太难记了,用u, g, o, a更简单!

u, g, o, 和 a是用来设置或查看文件或目录权限在类Unix或Linux系统中的特殊字符,它们分别代表文件或目录的所有者(user)、所属组(group)、其他用户(others)和所有用户(all users)。 而权限方r和w是其中的两种,分别代表读权限(read&#xff0…...

牛客热题:有效括号

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:有效括号题目链接方法一&#x…...

利用SQL语句实现多表联合查询——多表关系介绍

1.多对多查询 先创建一个student表和course表,应该利用外键来实现,通过一个中间表分别对应student和course中的id CREATE TABLE student (id INT unsigned PRIMARY KEY,name VARCHAR(255),no VARCHAR(50) ); CREATE TABLE course (id INT PRIMARY KEY,…...

Java中IO流类的体系

Java为我们提供了多种多样的IO流,我们可以根据不同的功能及性能要求挑选合适的IO流,如图所示,为Java中IO流类的体系。 从上图发现,很多流都是成对出现的,比如: FileInputStream/FileOutputStream&#xff0…...

【调试笔记-20240521-Linux-编译 QEMU/x86_64 可运行的 OpenWrt 固件】

调试笔记-系列文章目录 调试笔记-20240521-Linux-编译 QEMU/x86_64 可运行的 OpenWrt 固件 文章目录 调试笔记-系列文章目录调试笔记-20240521-Linux-编译 QEMU/x86_64 可运行的 OpenWrt 固件 前言一、调试环境操作系统:Ubuntu 22.04.4 LTS编译环境调试目标 二、调…...

如何用QtScrcpy实现Android设备实时投屏:终极免费解决方案

如何用QtScrcpy实现Android设备实时投屏:终极免费解决方案 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScr…...

祝贺电影《日掛中天》荣获2026亚洲艺术电影节两项提名

祝贺电影《日掛中天》荣获2026亚洲艺术电影节两项提名 。 祝贺演员辛芷蕾 提名最佳女主角; 祝贺演员冯绍峰 提名最佳男配角。#亚洲艺术电影节#AAFF2026#电影节#辛芷蕾#冯绍峰#电影日掛中天...

利用叉乘判断OpenGL中的左右关系

在 OpenGL 中,判断一个点或向量相对于另一个向量(如视线方向或边)的“左右关系”,本质上是一个空间方位判定问题。其核心方法是利用叉乘(Cross Product)的几何特性,结合坐标系的手性规则来实现。…...

视频抠像革命:如何用MatAnyone在5分钟内获得专业级绿幕效果

视频抠像革命:如何用MatAnyone在5分钟内获得专业级绿幕效果 【免费下载链接】MatAnyone [CVPR 2025] MatAnyone: Stable Video Matting with Consistent Memory Propagation 项目地址: https://gitcode.com/gh_mirrors/ma/MatAnyone 还在为视频抠像烦恼吗&am…...

如何突破信息壁垒?开源工具的技术可能性与使用边界

如何突破信息壁垒?开源工具的技术可能性与使用边界 工具定位:数字时代的信息获取辅助者 核心问题:为什么主流浏览器会允许此类扩展存在? 在信息爆炸与访问限制并存的数字时代,一类特殊的浏览器扩展逐渐进入公众视野。这…...

OpenClaw Skills 开发实战笔记

什么是 Skill? 简单说,Skill 是一个文件夹,里面包含 SKILL.md(核心指令文件)和配套脚本。它的作用是给 Agent 赋予特定的"工作流程"能力,而不是零散的、每次都要重新解释的指令。Skill vs Memory…...

AI 日报 - 2026年4月10日

🔬 科技类 5 条1. Anthropic 年化收入首超 OpenAI,4个月从90亿飙到300亿美元这速度真的让人有点惊呆——Anthropic 的年化收入在短短4个月内从90亿美元狂飙到300亿美元,首次反超 OpenAI(当前约250亿)。更有意思的是&am…...

终极指南:如何在OPPO手机上配置Salt Player流体云实现多设备音乐无缝切换

终极指南:如何在OPPO手机上配置Salt Player流体云实现多设备音乐无缝切换 【免费下载链接】SaltPlayerSource Salt Player (A local music player trusted and chosen by hundreds of thousands of users) for Android Release, Feedback. 项目地址: https://gitc…...

【书生·浦语】internlm2-chat-1.8b在医疗健康领域应用:症状自查与报告解读

【书生浦语】internlm2-chat-1.8b在医疗健康领域应用:症状自查与报告解读 1. 医疗AI助手带来的改变 想象一下这样的场景:深夜突然感觉身体不适,但又不想半夜跑急诊;或者拿到一份体检报告,看着一堆专业术语和指标数值…...

终极指南:如何用Bitfocus Companion将普通控制器变身高性价比专业控制台

终极指南:如何用Bitfocus Companion将普通控制器变身高性价比专业控制台 【免费下载链接】companion Bitfocus Companion enables the Elgato Stream Deck and other controllers to be a professional shotbox surface for an increasing amount of different pres…...