Spring Aop实现日志收集和重复属性赋值

Spring Aop实现日志收集和重复属性赋值

简介

​ AOP(Aspect-Oriented Programming),即面向切面编程,用人话说就是把公共的逻辑抽出来,让开发者可以更专注于业务逻辑开发。

​ 和IOC一样,AOP也指的是一种思想。AOP思想是OOP(Object-Oriented Programming)的补充。OOP是面向类和对象的,但是AOP则是面向不同切面的。一个切面可以横跨多个类和对象去操作,极大的丰富了开发者的使用方式,提高了开发效率。

譬如,一个订单的创建,可能需要以下步骤:

  1. 权限校验

  2. 事务管理

  3. 创建订单

  4. 日志打印

如果使用AOP思想,我们就可以把这四步当成四个“切面”,让业务人员专注开发第三个切面,其他三个切面则是基础的通用逻辑,统一交给AOP封装和管理。

Spring AOP有如下概念:

术语翻译释义
Aspect切面切面由切入点和通知组成,它既包含了横切逻辑的定义,也包括了切入点的定义。切面是一个横切关注点的模块化,一个切面能够包含同一个类型的不同增强方法,比如说事务处理和日志处理可以理解为两个切面。
PointCut切入点切入点是对连接点进行拦截的条件定义,决定通知应该作用于截哪些方法。(充当where角色,即在哪里做)
Advice通知通知定义了通过切入点拦截后,应该在连接点做什么,是切面的具体行为。(充当what角色,即做什么)
Target目标对象目标对象指将要被增强的对象,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象。
JoinPoint连接点连接点是程序在运行时的执行点,这个点可以是正在执行的方法,或者是正在抛出的异常。因为Spring只支持方法类型的连接点,所以在Spring中连接点就是运行时刻被拦截到的方法。连接点由两个信息确定:+ 方法(表示程序执行点,即在哪个目标方法)+ 相对点(表示方位,即目标方法的什么位置,比如调用前,后等)
Weaving织入织入是将切面和业务逻辑对象连接起来, 并创建通知代理的过程。织入可以在编译时,类加载时和运行时完成。在编译时进行织入就是静态代理,而在运行时进行织入则是动态代理。

对于通知类型来说:

Before Advice连接点执行前执行的逻辑
After returning advice连接点正常执行(未抛出异常)后执行的逻辑
After throwing advice连接点抛出异常后执行的逻辑
After finally advice无论连接点是正常执行还是抛出异常,在连接点执行完毕后执行的逻辑
Around advice该通知可以非常灵活的在方法调用前后执行特定的逻辑

代码实现

1、创建注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {String value() default "";
}

2、切面类


@Aspect
@Slf4j
@Component
public class LogAspect {/*** 切入点*/@Pointcut("execution(* com.zh.cn.*.*.*(..)) && @annotation(com.zh.cn.annotation.Log)")public void LogAspect(){}@Before("LogAspect()")public void before(JoinPoint joinPoint){//收集日志系统log.info("日志收集---前置通知");//获取日志收集中的实体类log.info("参数:{}",joinPoint);//获取basePojo实体类Object[] args = joinPoint.getArgs();Object entity = args[0];try {Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", Date.class);Method setUpdateName = entity.getClass().getDeclaredMethod("setUpdateName", String.class);//通过反射为对象赋值setUpdateTime.invoke(entity,new Date());setUpdateName.invoke(entity,"zh");} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {throw new RuntimeException(e);}//收集日志//~~~~log.info("日志收集---后置通知");}
}

3、controller层

/*** @Description:* @author:<a href="2358853434@qq.com"></a> zh* @Create : 2024/10/5**/
@RestController
@RequestMapping("/order/v1")
public class OrderController {@Resourceprivate OrderService orderService;@GetMapping("/update")public Result update() {Order order = new Order();order.setId(1292071939041697792L);order.setName("测试商品");order.setNum(128L);return orderService.update(order);}@GetMapping("/insert")public Result insert(){return  Result.success();}
}

4、service层

@Service
@Slf4j
public class OrderServiceimpl implements OrderService {@ResourceRedisTemplate<String,String> redisTemplate;@ResourceRedisDistributedLock redisDistributedLock;/*** 更新订单接口* @param order* @return*/@Logpublic Result update(Order order) {log.info("update开始,订单号:{}",order.getId()+"order:"+order);//加锁成功while(redisDistributedLock.tryLock("order:"+order.getId()+":"+Thread.currentThread().getId(), "requestId", 10)) {//执行订单减减log.info("加锁成功"+Thread.currentThread().getId());redisTemplate.opsForValue().set("order:"+order.getId(), order.toString());break;}if (redisDistributedLock.unlock("order:"+order.getId()+":"+Thread.currentThread().getId(),"requestId")) {log.info("update结束,订单号:{}",order.getId());return Result.success();}return Result.error("下单失败");}
}

5、测试

测试用例

由于项目中加了spring-security的相关依赖,需要配置Authorization,不需要的友友请自行删除

GET http://localhost:19002/order/v1/update
Authorization: Basic cm9vdDpyb290
结果
测试用例

由于项目中加了spring-security的相关依赖,需要配置Authorization,不需要的友友请自行删除

GET http://localhost:19002/order/v1/update
Authorization: Basic cm9vdDpyb290
结果

image-20241005140727144

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1557306.html

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

相关文章

电商行业应用 WMS 的成功案例

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 京东&#xff1a;作为国内知名的电商巨头&#xff0c;京东拥有庞大的仓储体系。通过应用先进的 WMS 系统&#xff0c;实现了高效的库存管理、精准的订单拣选和快速…

Java中HashMap和HashTable的区别

HashTable&#xff1a; HashMap&#xff1a; HashMap和Hashtable将键和值对存储在哈希表中。使用 Hashtable 或 HashMap 时&#xff0c;我们指定一个用作键的对象以及要链接到该键的值。然后对键进行哈希处理&#xff0c;并将生成的哈希码用作表中存储值的索引。现在让我们借助…

基于java SpringBoot和Vue校园求职招聘系统设计

摘要 随着信息技术的迅猛发展&#xff0c;基于Java Spring Boot和Vue的校园求职招聘系统设计成为了解决高校就业难问题的重要手段。本文旨在探讨如何利用Java Spring Boot框架构建后端服务&#xff0c;以及使用Vue.js进行前端开发&#xff0c;从而创建一个高效、易用且功能全面…

掌控板micropython编程实现OLED中bmp图像

掌控板micropython编程实现OLED中bmp图像 1.设置输出格式 打开PCtoLCD2002软件&#xff0c;点击“选项”菜单&#xff0c;设置选项如图1所示。其中&#xff0c;点阵格式&#xff1a;阴码&#xff1b;取模走向&#xff1a;顺向&#xff1b;输出数制&#xff1a;十六进制。设置…

六、索引的数据结构

文章目录 1. 为什么使用索引2. 索引及其优缺点2.1 索引概述2.2 优点2.3 缺点3. InnoDB中索引的推演3.1 索引之前的查找3.1.1 在一个页中的查找3.1.2 在很多页中查找3.2 设计索引3.2.1 一个简单的索引设计方案3.2.2 InnoDB中的索引方案3.3 常见索引概念3.3.1 聚簇索引3.3.2 二级…

【Linux】线程与线程安全知识总结

向外张望的人在做梦&#xff0c; 向内审视的人才是清醒的。 --- 荣格 --- 我最近复习了线程安全这部分知识&#xff0c;将不明白的问题总结出来&#xff0c;并通过AI进行问答帮助我进行学习巩固。本人能力有限 &#xff0c;可能有些内容不准确&#xff0c;望各位大佬海涵&am…

_c++11

嗨喽大家好呀&#xff0c;今天阿鑫给大家带来的是c进阶——c11的内容&#xff0c;好久不见啦&#xff0c;下面让我们进入本节博客的内容吧&#xff01; _c11 统一的列表初始化右值引用可变模板参数(了解&#xff0c;不常接触)lambda表达式function和bind包装器 1. 统一的列表…

气膜体育馆:解决场地困境的新选择—轻空间

北京市近日出台了关于规范和加强新建充气膜体育建筑的指导意见&#xff0c;旨在有效解决区域体育配套不足的问题。这一政策的出台&#xff0c;不仅为全民健身打造了新的载体&#xff0c;也为校园体育设施建设指明了方向。 满足日益增长的健身需求 随着人们健康意识的提升&#…

Skyeye 云智能制造 v3.14.8 发布,ERP 商城 + AI

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

openmmlab使用系列(二):图像超分辨率重构

文章目录 前言一、图像超分辨率重构简介二、mmmagic实现图像超分 前言 超分辨率重构技术&#xff0c;作为计算机视觉领域的一项重要研究课题&#xff0c;近年来受到了广泛关注。随着科技的飞速发展&#xff0c;人们对图像质量的要求越来越高&#xff0c;尤其是在智能手机、监控…

SpringBoot3实战:实现接口签名验证

有时候我们要把自己的服务暴露给第三方去调用&#xff0c;为了防止接口不被授权访问&#xff0c;我们一般采用接口签名的方式去保护接口。 接下来松哥和大家聊一聊这个话题。 一 场景分析 什么时候需要接口签名&#xff1f; 接口签名是一种重要的安全机制&#xff0c;用于确…

JAVA基础: synchronized 和 lock的区别、synchronized锁机制与升级

1 synchronized 和 lock的区别 synchronized是一个关键字&#xff0c; lock是一个接口&#xff0c;实际使用的是实现类 synchronized通过触发的是系统级别的锁机制&#xff0c; lock是API级别的锁机制 synchronized自动获得锁&#xff0c;自动释放锁。 lock需要通过方法获得锁…

[oeasy]python036_数据类型有什么用_type_类型_int_str_查看帮助

回忆上次内容 ord(c)和chr(i) 这是俩函数 这俩函数是一对 相反相成的⚖️ ord 通过 字符 找到对应的 序号chr 通过 序号 找到对应的 字符 为什么ord后面括弧里的参数 一定 要加引号不加不行 而chr后面括弧里的参数 又一定 不加引号加了不行呢&#xff1f;&#x1f914; TypeErr…

强基计划与少儿编程有什么关系?

近年来&#xff0c;编程教育逐渐在基础教育中崭露头角&#xff0c;成为培养孩子逻辑思维、创新能力和解决问题能力的重要手段。而2020年推出的强基计划则是一项面向高考生的特殊招生计划&#xff0c;旨在为基础学科&#xff08;如数学、物理、化学、生物、历史、哲学等&#xf…

MySQL 删除数据库

使用 mysqladmin 删除数据库 使用普通用户登陆MySQL服务器&#xff0c;你可能需要特定的权限来创建或者删除 MySQL 数据库。 所以我们这边使用root用户登录&#xff0c;root用户拥有最高权限&#xff0c;可以使用 MySQL mysqladmin 命令来删除数据库。 在删除数据库过程中&a…

双向数据库迁移工具:轻松实现 MySQL 与 SQLite 数据互导

项目概述与作用 该项目的核心是实现 MySQL 和 SQLite 两种数据库之间的数据迁移工具。它能够轻松地将 MySQL 数据库中的数据导出为 SQLite 数据库文件&#xff0c;反过来也可以将 SQLite 数据库中的数据上传到 MySQL 数据库中。这个双向迁移工具非常适用于&#xff1a; 数据库备…

51c自动驾驶~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11491137 #BEVWorld BEV潜在空间构建多模态世界模型&#xff0c;全面理解自动驾驶~一、引言 世界模型建模了有关环境的知识&#xff0c;其可以通过给定的条件对未来进行合理的想象。未来想象要求世界模型具有物理规律的理解…

利用 OpenAI 和 Python 预测股市行情

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本文介绍了如何利用 OpenAI 和 Python 进行股市情绪预测。主要通过使用 EODHD 提供的股市和金融新闻 API 来提取新闻数据,并利用 LangChain 和 OpenAI 的大型语言模型进行情感分析。 一、综述 …

如何在电脑上启动两个微信实例

前言 有时候&#xff0c;我们需要在电脑端登陆两个微信&#xff0c;来处理不同的事情&#xff0c;之前快速双击微信图标即可打开多个微信&#xff0c;最近发现不是太好使&#xff0c;所以今天介绍一种使用window命令启动两个微信的方法。 步骤 1、找到微信的安装目录&#x…

js逆向--某招标公告公示搜索引擎DES解密

js逆向--某招标公告公示搜索引擎DES解密 一、寻找数据接口二、寻找解密入口三、编写代码一、寻找数据接口 打开网页,在搜索框中输入关键词python。 试图通过按F12或者右键打开开发者工具,发现均没有反应。这时需要点击浏览器右上角的三个点,然后点击更多工具–开发者工具,…