AOP切面记录日志-实操

前言

        记录日志的就是把很多重要的数据给记录下来,写到数据库中;可以写一个方法,组装好之日信息的参数穿进去,但这样做不是很优雅,因为对于日志来说,不是业务逻辑代码的一部分,不应该影响到业务代码的,所以,使用切面正好解决了这个问题。

使用案例

1、自定义注解

import java.lang.annotation.*;@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {//参数类Class< ? extends ConvertParam> convert();//操作类型BusinessType businessType() default BusinessType.OTHER;}

这个Log注解就是使用在需要记录日志的地方,注解里面的参数,是需要在注解使用时传进去的,有些给了默认值的的就可以不传,如果传了就会覆盖掉

2、参数统一

上面的注解里面有一个参数类:

Class< ? extends ConvertParam> convert();

 这个是自定义的一个接口,作用是将我们任何的参数转换成切面注解能够使用的参数,实现标准化。例如:SysLog类,有两个属性,这个就是接口的标准返回值

public class SysLog {private Integer id;private String serviceName;
}

标准接口:

public interface ConvertParam<Param> {SysLog convert(Param param);
}

不管你传递的Param是什么类型,你在实现这个convert方法的时候,都必须想办法将Param转换为SysLog,因为SysLog这个对象是你后面写入逻辑的标准对象,就不需要你去做if-else的判断了,这个其实用到了策略模式,来处理多种实现方式。

3、定义切面、切点

@Aspect
@Component
public class LogAspect {@ResourceHttpServletRequest httpServletRequest;/*** 定义切面*/@Pointcut("@annotation(com.cart.cartservice.Log.annotation.Log)")public void section() {}/*** 环绕切点** @param* @return result*/@Around("section()")public Object log(ProceedingJoinPoint joinPoint) throws Throwable {//注解修饰的方法的返回结果Object result = joinPoint.proceed();//切面逻辑,收集日志什么的handleLog(joinPoint, result);//这个别忘记了return result;}@SneakyThrowsprivate void handleLog(ProceedingJoinPoint joinPoint, Object result) {//标准三部曲,拿取注解MethodSignature signature = (MethodSignature) joinPoint.getSignature();Method method = signature.getMethod();Log logAnnotation = method.getAnnotation(Log.class);//获取方法参数Object[] args = joinPoint.getArgs();//获取注解里面的通用接口,这一步就是接口的参数转换为标准类型,方便后续使用Class<? extends ConvertParam> convert = logAnnotation.convert();ConvertParam convertParam = convert.newInstance();SysLog sysLog = convertParam.convert(args[0]);//拿到sysLog 标准对象之后,就可以定义标准的写入逻辑,不需要做任何的类型判断了}}

切面配置你自定义的注解,只要是出现你注解的地方就是切面,然后就是切点和处理逻辑。

 4、使用注解

    @Log(convert = IntegerConvertParamImpl.class,businessType = BusinessType.QUERY)@GetMapping("{id}")public ResponseEntity<Cart> queryById(@PathVariable("id") Integer id) {return ResponseEntity.ok(this.cartService.queryById(id));}

IntegerConvertParamImpl就是将接口的参数转换为标准SysLog的实现类

import com.cart.cartservice.Log.convert.ConvertParam;
import com.cart.cartservice.Log.entity.SysLog;
import org.springframework.stereotype.Service;@Service
public class IntegerConvertParamImpl implements ConvertParam<Integer> {@Overridepublic SysLog convert(Integer integer) {SysLog sysLog = new SysLog();sysLog.setId(integer);return sysLog;}
}

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

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

相关文章

前端学习笔记 5:大事件

前端学习笔记 5&#xff1a;大事件 本文将学习一个示例项目&#xff08;大事件&#xff09;的前端搭建过程。 1.准备工作 1.1.创建工程 创建一个名称为big-event的 Vue3 项目&#xff0c;具体可以参考这篇文章。 1.2.安装插件 安装 ElementPlus&#xff1a; npm install…

【操作系统xv6】学习记录5--实验1 Lab: Xv6 and Unix utilities

ref:https://pdos.csail.mit.edu/6.828/2020/xv6.html 实验&#xff1a;Lab: Xv6 and Unix utilities 环境搭建 实验环境搭建&#xff1a;https://blog.csdn.net/qq_45512097/article/details/126741793 搭建了1天&#xff0c;大家自求多福吧&#xff0c;哎。~搞环境真是折磨…

分布式锁3: zk实现分布式锁5 使用中间件curator

一 curator的说明 1.1 curator的说明 curator是netflix公司开源的一个zk客户端。对Zookeeper提供的原生客户端进行封装&#xff0c;简化了Zookeeper客户端的开发量。Curator解决了很多zookeeper客户端非常底层的细节开发工作&#xff0c;包括连接重连、反复注册wathcer和Node…

算法基础之二分与前缀和 day 6

文章目录 二分第一类第二类 前缀和原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码 二分 二分法是我们在高中数学就学习过的一种思想&#xff0c;他也是一种效率较高的查找算法&#xff0c;在编写代码的过程中&#xff0…

基于SpringBoot的环保网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的环保网站,java项目。 e…

GoldenGate工作原理及应用场景

GoldenGate工作原理及应用场景 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同探讨数据库领域中备受关注的实时数据复制技术——GoldenG…

Flink自定义函数UDF

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 概述 用户自定义函数&#xff08;user-defined function&#xff0c;UDF&#xff09;&#xff0c;即用户可以根据…

ResNet论文阅读和简单实现

论文&#xff1a;https://arxiv.org/pdf/1512.03385.pdf Deep Residual Learning for Image Recognition 本模块主要是阅读论文&#xff0c;会做简单的翻译&#xff08;至少满足我自己能看明白&#xff09;。 Introduction 由上图可见&#xff0c;在20层和56层的网络上训练的…

听GPT 讲Rust源代码--compiler(29)

File: rust/compiler/rustc_const_eval/src/util/check_validity_requirement.rs 在Rust编译器的源代码中&#xff0c;rust/compiler/rustc_const_eval/src/util/check_validity_requirement.rs文件的作用是进行验证要求的检查。具体而言&#xff0c;该文件定义了函数check_val…

服务器GPU温度过高挂掉排查记录

服务器GPU挂掉 跑深度学习的代码的时候发现中断了。通过命令查看&#xff1a; nvidia-smi显示 Unable to determine the device handle for GPU 0000:01:00.0: Unknown Error。感觉很莫名其妙。通过重启大法之后&#xff0c;又能用一段时间。 shutdown -r now但是过了一个小…

配置cendos 安装docker 配置阿里云国内加速

由于我安装的cendos是镜像版。已经被配置好了。所以只需要更新相关配置信息即可。 输入 yum update自动更新所有配置 更新完成后输入 yum list docker-ce --showduplicates | sort -r 自动查询所有可用的docker版本 输入 yum install docker-ce docker-ce-cli container…

营业执照代办网站源码 工商注册代账公司模板源码 公司注册和企业资质业务办理网站

这款大气蓝色的网站响应式模板专门为工商记账、公司注册和企业资质业务办理公司设计,包含了16个页面,非常适合正在寻找一个高质量网站模板的企业使用。 该模板使用响应式设计,使其能够在各种设备上呈现良好的用户体验,包括PC、平板和手机等。同时,页面设计非常美观,允许…

netcore html to pdf

一、新建项目&#xff1a;QuestPDFDemo <PackageReference Include"NReco.PdfGenerator" Version"1.2.1" /> 二、上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging;using QuestPDFDemo.Models; using System; using Sys…

解决使用localhost或127.0.01模拟CORS失效

解决使用localhost或127.0.01模拟CORS失效 前言问题发现问题解决 前言 CORS (Cross-Origin Resource Sharing) 指的是一种机制&#xff0c;它允许不同源的网页请求访问另一个源服务器上的某些资源。通常情况下&#xff0c;如果 JavaScript 代码在一个源中发起了 AJAX 请求&…

【Qt- C++ Qml 交互】

Qt编程指南 VX&#xff1a;hao541022348 ■ 将C对象注册到 QML中&#xff0c;在QML使用C对象&#xff08;Q_INVOKABLE宏&#xff09;■ C对象注册到元对象系统■ Q_INVOKABLE 宏■ 演示步骤 ■ 将C对象注册到 QML中&#xff0c;在QML使用C对象&#xff08;Q_PROPERTY宏 属性绑定…

基于SpringBoot的名城小区物业管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的名城小区物业管理系统,…

数据分析——快递电商

一、任务目标 1、任务 总体目的——对账 本项目解决同时使用多个快递发货&#xff0c;部分隔离区域出现不同程度涨价等情形下&#xff0c;如何快速准确核对账单的问题。 1、在订单表中新增一列【运费差异核对】来表示订单运费实际有多少差异&#xff0c;结果为数值。 2、将…

微服务实战系列之Filter

前言 Filter&#xff0c;又名过滤器&#xff0c;当然不是我们日常中见到的&#xff0c;诸如此类构件&#xff1a; 而应该是微服务中常使用的&#xff0c;诸如此类&#xff08;图片来自官网&#xff0c;点击可查看原图&#xff09;&#xff1a; 一般用于字符编码转换&#xf…

最大子数组和【DP】

Problem: 53. 最大子数组和 文章目录 思路 & 解题方法复杂度Code 思路 & 解题方法 以前常见的线性DP&#xff0c;题目简单&#xff0c;可以不需要用数组来存储dp的值。 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间…

Java Swing手搓童年坦克大战游戏(II)

文章目录 0.初衷1.创建游戏窗口2.创建坦克3.实现坦克移动和发射炮弹4.创建地图4.1关于地图瓦片的尺寸遇到的问题 5.坦克与障碍物的碰撞处理5.1碰撞检测5.2坦克与地图中的瓦片碰撞5.3坦克相互碰撞5.4坦克碰见炮弹5.5坦克拐弯 6.道具6.1星星6.2炸弹6.3钟表6.4城堡6.5坦克6.6无敌圈…