springboot 中Aop注解切面实现收集日志与统计耗时2

一  Aop注解实现切面

1.1 工程结构

@Before:前置通知, 在方法执行之前执行
@Aroud:环绕通知, 围绕着方法执行
@After:后置通知, 在方法执行之后执行
@AfterReturning:返回通知, 在方法返回结果之后执行
@AfterThrowing:异常通知, 在方法抛出异常之后

1.2 定义切面注解

1.核心代码阐述

@Pointcut("execution(public * com.ljf.springboot.mybaits.demos.controller..*(..))")
public void allController() {
}

在com.ljf.springboot.mybaits.demos.controller中所有类的所有方法执行时,触发切面逻辑。

2.代码如下:

package com.ljf.springboot.mybaits.demos.config;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
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;

/**
 * @ClassName: LogAop
 * @Description: TODO
 * @Author: admin
 * @Date: 2024/03/21 23:45:14 
 * @Version: V1.0
 **/
@Aspect
@Slf4j
@Component
public class LogAop {

    /**
     * 定义切入点,切入点为com.lluozh.fagent.controller中的所有函数
     *通过@Pointcut注解声明频繁使用的切点表达式
     */
    @Pointcut("execution(public * com.ljf.springboot.mybaits.demos.controller..*(..))")
    public void allController() {
    }

    /**
     * @description  在连接点执行之前执行的通知
     */
    @Before("allController()")
    public void doBeforeGame(){
        System.out.println("====》 before 在连接点执行之前执行的通知。。。");
    }

    /**
     * @description  在连接点执行之后执行的通知(返回通知和异常通知的异常)
     */
    @After("allController()")
    public void doAfterGame(){
        System.out.println("====》 after! 在连接点执行之后执行的通知(返回通知和异常通知的异常)");
    }

    /**
     * @description  在连接点执行之后执行的通知(返回通知)
     */
    @AfterReturning("allController()")
    public void doAfterReturningGame(){
        System.out.println("===》 after 在连接点执行之后执行的通知(返回通知)");
    }

    /**
     * @description  在连接点执行之后执行的通知(异常通知)
     */
    @AfterThrowing("allController()")
    public void doAfterThrowingGame(){
        System.out.println("===》 after 在连接点执行之后执行的通知(异常通知)");
    }

    /**
     * @description 参数必须是ProceedingJoinPoint,通过该对象的proceed()方法来执行目标函数
     * proceed()的返回值就是环绕通知的返回值,proceedingJoinPoint是个接口
     * implement JoinPoint,所以也可以获得目标函数的类名,方法名等参数
     */
    @Around("allController()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
        String requestArgs = Arrays.toString(pjp.getArgs());
        String requestURI = request.getRequestURI();
        log.info("====》URI:{}, 参数:{}", requestURI, requestArgs);
        Object result = pjp.proceed();
        log.info("=====》URI:{}, 返回: {}", requestURI, result);
        return result;
    }
}

1.3 测试效果

1.调用controller中的方法

2. 请求结果

3.查看日志

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软考高项】十七、项目管理概论之项目基本要素

1、项目基础 项目具备的一些要素: 1)独特的产品、服务或成果 开展项目是为了通过可交付成果达成目标。 ◆ 目标 是所指向的结果、要取得的战略地位、要达到的目的、要获得的成果、要生产 的产品或者要提供的服务 ◆ 可交付成果 是指在某一过程、阶…

【STK】手把手教你利用STK进行导弹和反导仿真01 - STK/MMT模块安装部署

【STK】手把手教你利用STK进行导弹和反导仿真01 - STK/MMT模块安装部署 MMT模块与STK的版本是一一对应的,比如我现在手上的版本是MMT9的,那么我使用的STK的版本也必须是9版本的,如果你现在正在使用的是更高版本的STK,比如说10、11.2、11.6、12.2,那么该怎么办呢? 这个经本…

基于ssm的学生选课管理系统的设计与实现

一、功能介绍 管理员功能分析 1、管理员用户可以查询所有学生信息,也可以根据学生的学号、学院、专业、班级查询学生信息。可以修改学生的姓名、年龄、身份证号、性别、密码、专业、学院、班级,可以增加、删除学生 2、管理员用户可以查询所有教师信息&…

使用python实现布丰投针法

对于π的值,直到1946年的时候,人类才能将π的值精确计算到小数点后2037位,而现在的超级计算机的能力可以精确的计算到小数点后几十亿位,然而在计算机发明之前,还是使用这里的布丰投针法来计算π值,是最实用…

React antd中下拉框联动没有清除上一次选中的内容

bug&#xff1a; 第一次&#xff1a; 第二次&#xff1a; 解决方法&#xff1a; <Fotm.item> <SelectshowSearchplaceholder"请输入单位名称"filterOption{selectFilterOption}options{bmSelectOptions}onChange{handleDwmcChange}/></F…

非平坦地形下运动规划相关理论

1.SVD平面拟合方法 空间中的离散点得到拟合平面&#xff0c;其实就是一个最优化的过程。即求这些点到某个平面距离和最小的问题。我们知道一个先验消息&#xff0c;那就是该平面一定会过众散点的平均值。接着我们需要做的工作就是求这个平面的法向量。 根据协方差矩阵的SVD变换…

WiFi已连接却不可上网是什么原因?

很多使用wifi上网的用户都遇到过这样的问题,就是电脑已经连接了wifi,但就是上不了网。着到底是怎么回事呢?今天,极客狗带大家一起来找找WiFi已连接却不可上网是什么原因,并给出对应的解决方。 原因分析: 可能是ip地址冲突所导致,也有可能是宽带出先故障,不妨试试下面的…

MySQL:数据类型

文章目录 数据类型分类数值类型越界访问bit类型小数类型floatdecimal 字符串类型charvarchar 日期enum和set 数据类型分类 在MySQL数据库中&#xff0c;存在各种各样的数据类型&#xff1a; 针对于上述的这么多类型&#xff0c;本篇就对于这些类型的数据进行一一解释&#xff…

五分钟快速搭建个人游戏网站(1Panel)

五分钟快速搭建个人游戏网站&#xff08;1Panel&#xff09; 环境要求&#xff1a;主流 Linux 发行版本&#xff08;基于 Debian / RedHat&#xff0c;包括国产操作系统&#xff09;&#xff1b; 如果是Windows OS的可以通过WSL来实现安装。 1 介绍 1Panel 是一个基于 Web 的 L…

SSR910Q系列高性价比NVR解决方案

一、方案描述 SSR910Q&#xff0c;主芯片内核为A53双核64位最高主频为1.2Ghz处理器&#xff0c;内置2Gb DDR3&#xff0c;最高速率可支持2133Mb/s。高性能H.265/H.264/MJPEG视频编解码&#xff0c;智能处理单元&#xff08;IPU&#xff09;。支持高速I/O接口&#xff0c;如USB…

包含多个段的程序

文章目录 包含多个段的程序在代码段中使用数据在代码段中使用栈将数据、代码、栈放入不同的段 包含多个段的程序 在代码段中使用数据 考虑这样一个问题&#xff0c;编程计算以下8个数据的和&#xff0c;结果存在ax 寄存器中&#xff1a;0123H&#xff0c;0456H&#xff0c;07…

FaceBook广告账号验证教程

1.登录facebook账号,点击左边的ads manager。 2.点击Create ad创建广告。 3.选择广告投放意向。 4.填写广告信息。 5.创建广告后选择付款方式&#xff0c;这里我是使用信用卡付款。这里我是使用Fomepay的虚拟卡进行绑定的。 6.填写信用卡的持卡人姓名 卡号 有效期 安全码 7.填写…

Negative Sampling with Adaptive DenoisingMixup for Knowledge Graph Embedding

摘要 知识图嵌入(Knowledge graph embedding, KGE)的目的是通过对比正负三元组&#xff0c;将知识图中的实体和关系映射到一个低维、密集的向量空间中。在kge的训练过程中&#xff0c;由于kge只包含正三元组&#xff0c;因此负采样对于找到高质量的负三元组至关重要。大多数现…

【Redis】Redis特性

Redis 认识redisRedis特性在内存中存储数据可编程可扩展性持久化Clustering高可用性 认识redis Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志…

时间对比投资:衡量5天与10天六西格玛绿带培训的价值

六西格玛绿带培训专为希望提高其业务流程改进技能的专业人员设计。绿带培训通常涵盖六西格玛的基础知识、DMAIC(定义、测量、分析、改进、控制)方法论、以及各种质量管理工具和技巧。绿带受训者通常在他们的工作职责中负责领导小型项目或作为黑带项目团队的成员&#xff0c;下面…

(附源码)基于Spring Boot + Vue的招聘平台设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31…

使用Django实现信号与消息通知系统【第154篇—Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Django实现信号与消息通知系统 在Web应用程序中&#xff0c;实现消息通知系统是至关重…

【JAVA】数组的定义和使用

JAVA的数组和c语言的相似但是在创建上略有不同 数组的创建及初始化 T[] 数组名 new T[N]; T&#xff1a;表示数组中存放元素的类型 T[]&#xff1a;表示数组的类型 N&#xff1a;表示数组的长度 动态初始化 int[] array new int[10]; 静态初始化 int[] array1 new …

边缘计算基础介绍及AKamai-linode产品分析

1、背景 随着互联网的发展&#xff0c;我们进入了大数据时代&#xff0c;这个时代也是移动互联网的时代&#xff0c;而且这个时代&#xff0c;大量的线下服务走到线上&#xff0c;随之而来的&#xff0c;比如外卖、叫车……于是&#xff0c;有各种各样的 App 和设备在收集你的…

基于DWT(离散小波变换)的图像水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…