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

Spring (八)AOP-切面编程的使用

目录

实现步骤:

1 导入AOP依赖

2 编写切面Aspect

3 编写通知方法

4 指定切入点表达式

5 测试AOP动态织入


图示:

实现步骤:

1 导入AOP依赖

        <!-- Spring Boot AOP依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

2 编写切面Aspect

@Aspect         // 标记为切面类
@Component      // 由Spring容器管理
public class LogAspect {// 切入点表达式和通知方法在此定义
}

3 编写通知方法

通知方法(Advice) 是面向切面编程(AOP)中的核心概念,表示在目标方法(或切入点)的某个执行阶段插入的增强逻辑。通俗来说,就是“在某个地方(切入点)做某件事(增强逻辑)”。

通知方法的类型

Spring AOP 提供了5种通知类型,对应不同的执行时机:

注解执行时机典型场景
@Before目标方法执行前参数校验、权限验证
@After目标方法执行后(无论是否抛出异常)资源清理、日志记录
@AfterReturning目标方法正常返回后(无异常时执行)记录结果、缓存数据
@AfterThrowing目标方法抛出异常后异常处理、告警通知
@Around包围目标方法(可自定义方法执行前后逻辑,甚至阻止方法执行)性能监控、事务管理


代码实现:

package org.example.spring02.aspect;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component
@Aspect
public class LogAspect {public void logStart() {System.out.println("【切面-日志】开始");}public void logEnd() {System.out.println("【切面-日志】结束");}public void logReturn() {System.out.println("【切面-日志】返回");}public void logException() {System.out.println("【切面-日志】异常:");}}

4 指定切入点表达式

作用:通过表达式定义哪些方法需要被拦截。
语法结构

execution([访问权限] 返回类型 包名.类名.方法名(参数类型) [异常类型])

代码实现:

精确指定接口的路径:

    @Before("execution(int org.example.spring02.MathMethod.MathCalculator.*(..))")public void logStart() {System.out.println("【切面-日志】开始");}
package org.example.spring02.aspect;import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;@Component
@Aspect
public class LogAspect {@Before("execution(int *(int,int))")public void logStart() {System.out.println("【切面-日志】开始");}@After("execution(int *(int,int))")public void logEnd() {System.out.println("【切面-日志】结束");}@AfterReturning("execution(int *(int,int))")public void logReturn() {System.out.println("【切面-日志】返回");}@AfterThrowing("execution(int *(int,int))")public void logException() {System.out.println("【切面-日志】异常:");}}

5 测试AOP动态织入

package org.example.spring02;import org.example.spring02.MathMethod.MathCalculator;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class AopTest {@AutowiredMathCalculator mc;@Testpublic void test01() {int add = mc.add(1, 2);System.out.println(add);}}

相关文章:

Spring (八)AOP-切面编程的使用

目录 实现步骤&#xff1a; 1 导入AOP依赖 2 编写切面Aspect 3 编写通知方法 4 指定切入点表达式 5 测试AOP动态织入 图示&#xff1a; 实现步骤&#xff1a; 1 导入AOP依赖 <!-- Spring Boot AOP依赖 --><dependency><groupId>org.springframework.b…...

VS Code连接服务器教程

VS Code是什么 VS Code&#xff08;全称 Visual Studio Code&#xff09;是一款由微软推出的免费、开源、跨平台的代码编辑神器。VS Code 支持 所有主流操作系统&#xff0c;拥有强大的功能和灵活的扩展性。 官网&#xff1a;https://code.visualstudio.com/插件市场&#xff1…...

leetcode69.x 的平方根

题目&#xff1a; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。…...

HttpServletRequest 和 HttpServletResponse 区别和作用

一、核心作用对比 对象HttpServletRequest&#xff08;请求对象&#xff09;HttpServletResponse&#xff08;响应对象&#xff09;本质客户端发给服务器的 HTTP 请求信息&#xff08;输入&#xff09;服务器返回客户端的 HTTP 响应信息&#xff08;输出&#xff09;生命周期一…...

国家二级运动员证书有什么用·棒球1号位

以棒球运动为例&#xff0c;国家二级棒球运动员证书是由中国国家体育总局颁发的运动员技术等级认证&#xff0c;主要作用体现在以下几个方面&#xff1a; 一、升学优势 体育特招资格&#xff1a;符合条件者可报考高校高水平运动队或体育单招&#xff0c;部分院校对二级运动员有…...

Windsuf 连接失败问题:[unavailable] unavailable: dial tcp...

问题描述 3月6日&#xff0c;在使用Windsuf 时&#xff0c;遇到以下网络连接错误&#xff1a; [unavailable] unavailable: dial tcp 35.223.238.178:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of…...

docker中kibana启动后,通过浏览器访问,出现server is not ready yet

问题&#xff1a;当我在浏览器访问kibana时&#xff0c;浏览器给我报了server is not ready yet. 在网上试了很多方法&#xff0c;都未能解决&#xff0c;下面是我的方法&#xff1a; 查看kibana日志&#xff1a; docker logs -f kibana从控制台打印的日志可以发现&#xff…...

更多文章请查看

更多文章知识请移步至下面链接&#xff0c;期待你的关注 如需查看新文章&#xff0c;请前往&#xff1a; 博主知识库https://www.yuque.com/xinzaigeek...

(十 九)趣学设计模式 之 中介者模式!

目录 一、 啥是中介者模式&#xff1f;二、 为什么要用中介者模式&#xff1f;三、 中介者模式的实现方式四、 中介者模式的优缺点五、 中介者模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;…...

博弈论算法

一、减法游戏 初始有一个数 n。 两个玩家轮流操作&#xff0c;每次可以减去 1 到 9 之间的任意整数。 将数减到 0 的玩家获胜。 可以发现规律&#xff1a; 减法游戏只需要判断当前数取模是否为0&#xff0c;即可快速判断胜负。 例题&#xff1a; Leetcode 292. Nim 游戏 …...

【网络】HTTP协议、HTTPS协议

HTTP与HTTPS HTTP协议概述 HTTP&#xff08;超文本传输协议&#xff09;&#xff1a;工作在OSI顶层应用层&#xff0c;用于客户端&#xff08;浏览器&#xff09;与服务器之间的通信,B/S模式 无状态&#xff1a;每次请求独立&#xff0c;服务器不保存客户端状态&#xff08;通…...

GitCode 助力 vue3-element-admin:开启中后台管理前端开发新征程

源码仓库&#xff1a; https://gitcode.com/youlai/vue3-element-admin 后端仓库&#xff1a; https://gitcode.com/youlai/youlai-boot 开源助力&#xff0c;开启中后台快速开发之旅 vue3-element-admin 是一款精心打造的免费开源中后台管理前端模板&#xff0c;它紧密贴合…...

网络HTTP

HTTP Network Request Library A Retrofit-based HTTP network request encapsulation library that provides simple and easy-to-use API interfaces with complete network request functionality. 基于Retrofit的HTTP网络请求封装库&#xff0c;提供简单易用的API接口和完…...

Qt常用控件之表格QTableWidget

表格QTableWidget QTableWidget 是一个表格控件&#xff0c;行和列交汇形成的每个单元格&#xff0c;是一个 QTableWidgetItem 对象。 1. QTableWidget属性 QTableWidget 的属性只有两个&#xff1a; 属性说明rowCount当前行的个数。columnCount当前列的个数。 2. QTableW…...

FFmpeg入门:最简单的音视频播放器

FFmpeg入门&#xff1a;最简单的音视频播放器 前两章&#xff0c;我们已经了解了分别如何构建一个简单和音频播放器和视频播放器。 FFmpeg入门&#xff1a;最简单的音频播放器 FFmpeg入门&#xff1a;最简单的视频播放器 本章我们将结合上述两章的知识&#xff0c;看看如何融…...

【Python爬虫】爬取公共交通路网数据

程序来自于Github&#xff0c;以下这篇博客作为完整的学习记录&#xff0c;也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据&#xff0c;并生成shp文件&#xff0c;…...

009---基于Verilog HDL的单比特信号边沿检测

文章目录 摘要一、边沿检测二、时序逻辑实现2.1 rtl2.2 tb 三、组合逻辑实现3.1 rtl3.2 tb 摘要 文章为学习记录。采用时序逻辑和组合逻辑实现边沿检测的核心逻辑。组合逻辑实现的上升沿和下降沿的脉冲比时序逻辑实现的上升沿和下降沿的脉冲提前一拍。 一、边沿检测 边沿检测…...

Trae IDE新建C#工程

目录 1 结论 2 项目结构 3 项目代码 1 结论 新建C#工程来说&#xff0c;Trae的Chat比DeepSeek的Coder好用。 2 项目结构 MyWinFormsApp/ │ ├── Program.cs ├── Form1.cs ├── Form1.Designer.cs ├── MyResources/ │ └── MyResources.resx └── MyWin…...

前端快速搭建Node服务(解决跨域问题)

服务搭建应用场景 前端模块化基本成为了不可或缺的一步了&#xff0c;最近学习的时候&#xff0c;使用了EsModule语法&#xff0c;但使用import和export&#xff0c;会产生跨域问题&#xff0c;故自己本地搭建一个服务&#xff08;不需要下载npm包&#xff09;&#xff0c;一步…...

三、0-1搭建springboot+vue3前后端分离-idea新建springboot项目

一、ideal新建项目1 ideal新建项目2 至此父项目就创建好了&#xff0c;下面创建多模块&#xff1a; 填好之后点击create 不删了&#xff0c;直接改包名&#xff0c;看自己喜欢 修改包名和启动类名&#xff1a; 打开ServiceApplication启动类&#xff0c;修改如下&#xff1a; …...

Unity光照之Halo组件

简介 Halo 组件 是一种用于在游戏中创建光晕效果的工具&#xff0c;主要用于模拟光源周围的发光区域&#xff08;如太阳、灯泡等&#xff09;或物体表面的光线反射扩散效果。 核心功能 1.光晕生成 Halo 组件会在光源或物体的周围生成一个圆形光晕&#xff0c;模拟光线在空气…...

电容与电感以及其典型的电路

一、电容与电感的基本关系 1. 定义公式 电容&#xff08;C&#xff0c;单位&#xff1a;法拉F&#xff09; C Q / V &#xff08;电荷量Q与电压V的比值&#xff09; 电感&#xff08;L&#xff0c;单位&#xff1a;亨利H&#xff09; L Φ / I &#xff08;磁通链Φ与电流I…...

在昇腾GPU上部署DeepSeek大模型与OpenWebUI:从零到生产的完整指南

引言 随着国产AI芯片的快速发展&#xff0c;昇腾&#xff08;Ascend&#xff09;系列GPU凭借其高性能和兼容性&#xff0c;逐渐成为大模型部署的重要选择。本文将以昇腾300i为例&#xff0c;手把手教你如何部署DeepSeek大模型&#xff0c;并搭配OpenWebUI构建交互式界面。无论…...

递归专题刷题

文章目录 递归合并两个有序链表题解代码 反转链表题解代码 两两交换链表中的节点题解代码 Pow(x, n)&#xff08;快速幂&#xff09;题解代码汉诺塔题解代码 总结 递归 1. 重复的子问题宏观看待递归问题 合并两个有序链表 题目链接 题解 1. 重复的子问题 -> 函数头的设…...

电商项目-秒杀系统(四)秒杀异步下单防止重复秒杀

一、 防止恶意刷单解决 在生产场景下&#xff0c;可能会有一些人会恶意访问当前网站&#xff0c;来进行恶意的刷单。这样会造成当前系统出现一些业务上的业务混乱&#xff0c;出现脏数据&#xff0c;或者造成后端访问压力大等问题。 一般要解决这个问题的话&#xff0c;前端可…...

Android Studio 一直 Loading devices

https://stackoverflow.com/questions/71013971/android-studio-stuck-on-loading-devices...

摄相机标定的基本原理

【相机标定的基本原理与经验分享】https://www.bilibili.com/video/BV1eE411c7kr?vd_source7c2b5de7032bf3907543a7675013ce3a 相机模型&#xff1a; 定义&#xff1a; 内参&#xff1a;就像相机的“眼睛”。它描述了相机内部的特性&#xff0c;比如焦距&#xff08;镜头的放…...

CentOS 7 安装 Redis6.2.6

获取资源、下载安装 Redis6.2.6 安装Redis6.2.6 上传到服务器或直接下载&#xff08;wget http://download.redis.io/releases/redis-6.2.6.tar.gz&#xff09;、再解压安装 tar -zxvf redis-6.2.6.tar.gz 进入redis解压目录 cd redis-6.2.6先编译 make再执行安装 make PREFI…...

在CentOS系统上安装Conda的详细指南

前言 Conda 是一个开源的包管理系统和环境管理系统&#xff0c;广泛应用于数据科学和机器学习领域。本文将详细介绍如何在 CentOS 系统上安装 Conda&#xff0c;帮助您快速搭建开发环境。 准备工作 在开始安装之前&#xff0c;请确保您的 CentOS 系统已经满足以下条件&#x…...

3D数字化:家居行业转型升级的关键驱动力

在科技日新月异的今天&#xff0c;家居行业正经历着一场前所未有的变革。从传统的线下实体店铺到线上电商平台的兴起&#xff0c;再到如今3D数字化营销的广泛应用&#xff0c;消费者的购物体验正在发生翻天覆地的变化。3D数字化营销不仅让购物变得更加智能和便捷&#xff0c;还…...