springboot通过aop实现全局日志(是否自定义注解都可以)

news2024/9/28 13:28:29
内容参考自以下两个链接
1、springboot中使用AOP切面完成全局日志_aop全局日志_邹飞鸣的博客-CSDN博客
使用AOP记录日志_aop日志_trusause的博客-CSDN博客
第一个链接思路很清晰,讲的也很详细,第二个链接讲了自定义注解
为了便于自己理解做了以下整理

目录

1.aspectj基本概念

2.添加aop依赖

3.进行切面处理

(1)切面类

(2)自定义注解

(3)controller和serviceimpl

4.定义切点时包扫描路径的表达式怎么写


1.aspectj基本概念

下面两个类JoinPoint和ProceedingJoinPoint,ProceedingJoinPoint类在切面类中最后一个方法doAround()中用到了(已注释的部分),用于获取自定义注解

2.添加aop依赖

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

3.进行切面处理

主要是在切面类中设置切入点(指定包扫描路径),然后定义织入方式(方法前,方法后等)
也可以自定义注解,但是在我看来,最终还是要在切面类指定包扫描路径的,自定义注解无非是传入一些自定义参数,暂时没有探索别的用处
自定义注解的部分已被注释,直接放开注释就能使用

(1)切面类

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;


@Aspect
@Component
public class WebLogAspect {


    // 获取日志类,方便直接在控制台输出统一格式的日志信息
    private final static Logger logger = LoggerFactory.getLogger(WebLogAspect.class);


    /**
     * 以 controller 包下定义的所有请求为切入点
     */
    @Pointcut("execution(public * com.tt.test.controller.*.*(..))")
    public void webLog() {
    }


    /**
     * 在切点之前织入
     *
     * @param joinPoint
     * @throws Throwable
     */
    @Before("webLog()") // webLog():是你@Pointcut注解的方法名
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 开始打印请求日志
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();


        // 打印请求相关参数
        logger.info("========================================== Start ==========================================");
    }


    /**
     * 在切点之后织入
     *
     * @throws Throwable
     */
    @After("webLog()")
    public void doAfter() throws Throwable {
        logger.info("=========================================== End ===========================================");
        // 每个请求之间空一行
        logger.info("");
    }


    /**
     * 环绕
     *
     * @param proceedingJoinPoint
     * @return
     * @throws Throwable
     */
    @Around("webLog()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = proceedingJoinPoint.proceed();
        //获取自定义注解中传入的desc
        /*Signature signature = proceedingJoinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        EagleEye eagleEye = method.getAnnotation(EagleEye.class);
        String desc=eagleEye.desc();
        logger.info("Request desc   : {}", desc);*/
        logger.info("Request Args   : {}", Arrays.asList(result).toString());
        // 执行耗时
        logger.info("Time-Consuming : {} ms", System.currentTimeMillis() - startTime);
        return result;
    }
}

(2)自定义注解

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface EagleEye {
    //描述,默认为空
    String desc() default "";
}

(3)controller和serviceimpl

要想serviceimpl中的方法也被aop织入,需要把serviceimpl文件移动到controller文件夹中,因为切面类中定义了包扫描路径,或者不移动文件夹而是在切面类中定义切点的时候把serviceimpl的包路径也包含进去
controller
import com.tt.test.config.EagleEye;
import com.tt.test.service.EagleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
* 测试aop全局日志
*/
@RestController
@RequestMapping("/eagle")
public class EagleController {
    @Autowired
    private EagleService eagleService;


    @RequestMapping("/h1")
//    @EagleEye(desc = "hello1")
    public String h1(){return eagleService.h1();}


    @RequestMapping("/h2")
//    @EagleEye(desc = "hello2")
    public String h2(){return eagleService.h2();}
}
serviceimpl实现类(service层接口省略)
import com.tt.test.config.EagleEye;
import com.tt.test.service.EagleService;
import org.springframework.stereotype.Service;


@Service
public class EagleServiceImpl implements EagleService {
    @Override
//    @EagleEye(desc = "hello1-service")
    public String h1() {
        String s="s1";
        return s;
    }


    @Override
//    @EagleEye(desc = "hello2-service")
    public String h2() {
        String s="s2";
        return s;
    }
}

4.定义切点时包扫描路径的表达式怎么写

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

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

相关文章

闪光桐人の实习日记(2023年2月27日-3月3日)

前往闪闪の小窝以获得更好的阅读和评论体验 文章目录2023年3月2日&#xff08;测试流程&#xff09;为什么是什么如何进行2023年3月1日&#xff08;消息队列MQ&#xff09;什么是消息队列为什么要使用消息队列消息队列&#xff08;kafka&#xff09;的优势关键信息SpringBoot整…

LeetCode题目笔记——448. 找到所有数组中消失的数字

文章目录题目描述题目链接题目难度——简单方法一&#xff1a;使用额外空间&#xff0c;字典代码/Python代码/C方法二&#xff1a;进阶&#xff0c;原地修改代码/C代码/C总结题目描述 这好像是一到经典的面试题 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间…

遮挡检测--基于角度的遮挡检测方法

文章目录1基于角度的遮挡检测方法2遮挡检测遍历方法2.1方法1--自适应径向扫描方法2.2方法2--螺旋扫描法参考1基于角度的遮挡检测方法 在基于角度的方法中&#xff0c;通过依次分析DSM中沿径向方向的投影光线的角度来识别遮挡。定义α\alphaα角&#xff1a;DSM三维点与相机中心…

解决Windows虚拟机启动资源占用过多

由于虚拟机中的Windows一般是指定版本的&#xff0c;创建后&#xff0c;其自身仍在不断自动更新&#xff0c;因此这里我们禁用两个服务&#xff0c;以后启动Windows之后就不会占用太多资源了&#xff1a; 禁用setuphost.exe禁用.net runtime optimization 文章目录1. 禁用setu…

分布式定时任务-学习笔记

1 发展历程 1.1 Linux命令-CronJob 只能控制单台机器 1.2 任务调度-Quartz 单任务极致控制 1.3 分布式定时任务 1.3.1 定时任务 系统为了自动完成特定任务&#xff0c;实时、延时、周期性完成任务调度的过程 1.3.2 分布式定时任务 把分散的、可靠性差的定时任务纳入统一的平…

VScode下 ESP32 下载程序

ESP32-S3 下载方式可以通过UART0 下载,USB 下载&#xff0c;JTAG下载,还可以使用WIFI进行远程OTA升级程序。插件底栏按键介绍&#xff1a;①选择串口端口号&#xff0c;如COM3&#xff1b; ②选择芯片型号&#xff1b; ③工程idf设置&#xff0c;相当于menuconfig&#xff1b; …

Redis缓存雪崩、缓存击穿、缓存穿透

用户的数据一般都是存储于数据库&#xff0c;数据库的数据是落在磁盘上的&#xff0c;磁盘的读写速度可以说是计算机里最慢的硬件了。 当用户的请求&#xff0c;都访问数据库的话&#xff0c;请求数量一上来&#xff0c;数据库很容易就奔溃的了&#xff0c;所以为了避免用户直…

【Java】Spring Boot 日志文件

文章目录SpringBoot日志文件1. 日志有什么用2. 日志怎么用3. 自定义日志打印3.1 在程序中得到日志对象3.2 使用日志对象打印日志4. 日志级别4.1 日志级别有什么用&#xff1f;4.2 日志级别的分类与使用5. 日志持久化6. 更简单的日志输出--lombok6.1 添加 lombok 依赖6.2 输出日…

操作系统真相还原——第6章内存管理系统

第八章 内存管理系统 makefile 编译整个项目&#xff0c;如果改变局部关系&#xff0c;只靠人工难以维护文件间的依赖关系&#xff0c;所以通过make程序进行处理 makefile文件是make程序的搭档&#xff1a;发现某个文件更新后&#xff0c;只编译该文件和受该文件影响的相关文…

为什么95%的Java程序员人,都是用不好Synchronized?

Synchronized锁优化 jdk1.6对锁的实现引入了大量的优化&#xff0c;如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。 锁主要存在四中状态&#xff0c;依次是&#xff1a;无锁-> 偏向锁 -> 轻量级锁 -> 重量级锁&#xff0c;他们…

upload-labs通关详细教程

文章目录文件上传要点1、前端验证绕过做题步骤源码分析2、Content-Type方式绕过做题步骤源码分析3、黑名单绕过做题步骤源码分析4、.htaccess文件绕过简介做题步骤源码分析5、后缀大小写绕过简介做题步骤源码分析6、文件后缀&#xff08;空&#xff09;绕过简介做题步骤源码分析…

CAN工具-VSpy(ValueCAN) - Panel面板(续)

继续上次的Panel面板介绍&#xff01;&#xff01;&#xff01;7. LED 控件LED控件可以用作指示器。在Graphical Panels中选中该控件&#xff0c;在界面右侧侧拉框的Properties中可设置LED控件的通用属性。LED控制属性LED On Color&#xff1a;双击打开标准的Windows颜色选择器…

Vue 3.0 学习笔记之基础知识

系列文章目录 提示&#xff1a;阅读本章之前&#xff0c;请先阅读目录 文章目录系列文章目录前言Vue 3.0 创建与Vue2.0对比的变化关闭语法检查setup 组合式函数compositions前言 Vue 3.0 创建 与Vue2.0对比的变化 关闭语法检查 lintOnSave: false setup 组合式函数compositions…

Git 初体验 (处理 .ssh 文件的相关问题)

目录前沿环境入门教程出现的问题问题 1 &#xff1a;C 盘用户文件中找不到 .ssh 文件问题 2 : 在 clone 远程仓库文件时报错问题3 : 第一次从 Gitee clone 项目时会弹出一个 Git 窗口,要你输入用户和密码获取 credential (可以信任的证明)自我实践总结引用前沿 很早前安装了 G…

二叉树——删除二叉搜索树中的节点

删除二叉搜索树中的节点 链接 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可…

2022_SPL_CMINet

Cross-Stage Multi-Scale Interaction Network for RGB-D Salient Object Detection 用于rgb-d显着目标检测的跨阶段多尺度交互网络 目录 文章目录 前言 一、引言 二、提出的方法 A.概述 感觉有点乱&#xff0c;没看太懂&#xff0c;没关系&#xff0c;我们接着往下看 …

Postman 实现 UI 自动化测试

看到这篇文章的标题&#xff0c;是不是有小伙伴会感到惊讶呢&#xff1f; Postman 不是做接口测试的吗&#xff1f;为什么还能做 UI 自动化测试呢&#xff1f; 其实&#xff0c;只要你了解 Selenium 的运行原理&#xff0c;就可以理解为什么 Postman 也能实现 UI 自动化测试了…

EPICS motor模块

一、概要 1&#xff09; 在EPICS motor模块中的是什么并且它为了什么&#xff1f; 2&#xff09; 支持的电机控制器和模型 3&#xff09;电机记录特性 4&#xff09;配置示例 5&#xff09;反馈 6&#xff09; 重试 7&#xff09; 回程差矫正 8&#xff09;发行 二、术…

Linux上的校验和验证

校验和&#xff08;checksum&#xff09;程序用来从文件中生成相对较小的唯一密钥。我们可以重新计算该密钥&#xff0c;用以检查文件是否发生改变。修改文件可能是有意为之&#xff08;添加新用户会改变密码文件&#xff09;&#xff0c;也可能是无意而为&#xff08;从CD-ROM…

Java:Java仍然处于领先地位?

没有多少编程语言能够自吹自擂并持续流行20多年&#xff0c;但Java就是其中之一。Java应用程序不仅局限于web和移动开发&#xff0c;而且给大数据和人工智能留下了深刻的印象。不用多说&#xff0c;让我们讨论一下Java流行的几个原因!!1.实用性根据JamesGosling的说法&#xff…