学习springBoot(八,AOP处理请求日志)

Spring Boot中使用AOP统一处理Web请求日志 由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处免费获取。[外链图片转存中…(img-yCfZm07Q-1713557569300)][外链图片转存中…(img-ZwKSzIpn-1713557569301)]由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处免费获取。 阅读详情

前言:AOP:将通用逻辑从业务逻辑中分离出来

一、在pom.xml中添加AOP依赖

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

二、往常的做法是在启动类上添加注解,但是aop不需要

三、建立我们的处理文件,首先建一个aspect包,再在包下面建议我们的类,

然后在类上面我们添加@Aspect注解和@Component注解如下:

/**
 * 系统日志,处理切面类
 */
@Aspect
@Component
public class HttpAspect {
    
}

四、我们现在要做的是在做一些增删改查前要验证是否登录了,下面我们就在HttpAspect下面进行验证和拦截。

@Aspect
@Component
public class HttpAspect {

    @Before("execution(public * com.imooc.controller.GirlController.girlList(..))")
    public void log(){
        System.out.println(11111);

    }
}

这里我们先验证一下girlList方法,格式就如上面的代码一样,下面我们运行程序进行测试!

这里我们还是用postman进行接口测试,看一下控制台:

打印出来了我们之前在HttpAspect中打印的数字!

若想把GirlController中的所有方法都添加此拦截,只需按照如下操作即可:

 @Before("execution(public * com.imooc.controller.GirlController.*(..))")

其中*号代表扫描所有的方法。

下面我们再测试一下@After方法

@Aspect
@Component
public class HttpAspect {

    @Before("execution(public * com.imooc.controller.GirlController.*(..))")
    public void log(){
        System.out.println(11111);

    }

    @After("execution(public * com.imooc.controller.GirlController.*(..))")
    public void doAfter(){
        System.out.println(2222);

    }

然后运行一下,看一下控制台的代码,先是执行了@Before方法,然后执行了GirlController方法,最后执行了@After方法。

现在我们发现我们在@Before和@After的注解中写了许多重复的代码,这样是非常不好的,所以下面我们用另外一种方法书写:

   @Pointcut("execution(public * com.imooc.controller.GirlController.*(..))")
    public void log(){
    }
    
    @Before("log()")
    public void doBefore(){
        System.out.println(1111);
    }
    @After("log()")
    public void doAfter(){
        System.out.println(2222);
    }

这里我们使用了@Pointcut,定义了一个公用的方法,然后在下面的注解中调用这个方法。运行代码验证也是成功的。

现在我们不再使用system进行打印,改用log进行打印,下面看一下操作流程:

   private final static Logger logger= LoggerFactory.getLogger(HttpAspect.class);

这里我们导入的是slf4j的日志,然后在下面我们直接调用即可,例如:

@Before("log()")
public void doBefore(){
   logger.info("111111111111");
}
@After("log()")
public void doAfter(){
    logger.info("22222222222");
}

经过测试成功,这里不再赘述测试过程!

测试成功,那我们就要正式使用它了!

首先编写以下代码:

  @Before("log()")
    public void doBefore(JoinPoint joinPoint){
        ServletRequestAttributes attributes= (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request= attributes.getRequest();

        //请求url
        logger.info("url={}",request.getRequestURL());

        //请求方式:GET POST...
        logger.info("method={}",request.getMethod());

        //客户端ip
        logger.info("ip={}",request.getRemoteAddr());

        //请求的那个类的方法
        String className=joinPoint.getTarget().getClass().getName();
        String methodName=joinPoint.getSignature().getName();
        logger.info("class-method={}",className+"."+methodName+"()");

        //请求参数
        logger.info("args={}",joinPoint.getArgs());
    }

即我们在程序启动前获取请求的url、请求的方式、请求的方法名等,并且将他们打印出来,下面运行一下测试结果:

这里还是使用postman测试,然后查看控制台的结果图如下:

我们已经打印出来了我们上面所需要的信息。参数没有的原因是因为我们在这个get方法中没有传参!下面我们换个带参数的测试以下:

这里我们带着参数id=7进行查询,查看控制台结果:

我们可以看到参数也被打印出来了!

那么我们现在思考一个功能,如何把查询出来的结果返回呢?下面我们进行编码:

  @AfterReturning(returning ="object",pointcut = "log()")
    public void doAfterReturning(Object object){
        logger.info("response={}",object);

    }

下面我们再运行程序进行测试:

查看控制台结果如下:

返回的结果已经被打印出来了,如果我们想打印具体的内容可以这样操作:

在Girl实体类中添加toString方法如下:

  @Override
    public String toString() {
        return "Girl{" +
                "id=" + id +
                ", cupSize='" + cupSize + '\'' +
                ", age=" + age +
                '}';
    }

然后在HttpAspect类中编码如下:

   @AfterReturning(returning ="object",pointcut = "log()")
    public void doAfterReturning(Object object){
        logger.info("response={}",object.toString());

    }

这样就可以打印出来具体内容如下:

response=Girl{id=7, cupSize='A', age=18}

 

关于AOP 的内容的学习就先到这里!!

SpringBoot使用AspectJ实现AOP记录接口:请求日志、响应日志、异常日志 AspectJ 是一个面向切面的框架,它扩展了 Java 语言,并定义了 AOP(面向切面编程)语法。AspectJ 作为 AOP 的具体实现之一,向 Java 中加入了连接点(Join Point)这个新概念,以及切点(pointcut)、通知(Advice)、类型间声明(Inter-type declaration)和方面(Aspect)等新结构。这些新结构使得AspectJ能够处理那些使用传统的面向对象编程方法难以解决的问题,如横切关注点(如安全性、日志记录、事务管理等)的模块化。 阅读详情

相关推荐

【专业书1】量化交易——从入门到精通

股票季节性策略几乎失效了,但商品期货的仍有效,因为其季节性需求源于真实的经济需求而非投机。交易策略获利的前提:交易价格处于均值回归(低价时买入)或动量状态(降价时先做空后以更低价买入),否则在随机游走状态下是无法有效交易的。构建交易策略实际上是在决定:在特殊条件、特定时间尺度下价格趋势的呈现(均值回归/趋势走势),以及用什么价格作为初始判断的参考价格。如果以高夏普比率为目标,需要更高的交易频率:基于大数定律,押注越多,偏离均值收益的偏差就越小。买同比最好的股票,卖同比最差的股票。但在不同的时间尺度下可以。

weixin_44589682的博客 1547

Spring 注解方式AOP

通过@annotation限定符传入变量名,我们可以在切面中获取被匹配方法或类上的注解对象,并根据注解对象的属性值来动态控制切面逻辑的行为,从而实现更加灵活和智能的切面处理。上面的代码中,beforeLog 方法中的 Log log 参数就是从切点方法上获取到的注解实例,可以使用 log.value() 来获取注解的 value 属性值。其中,注解类型是要匹配的注解的类类型,可以是Java内置的注解类型,也可以是自定义的注解类型。上面的代码定义了一个名为 Log 的注解,该注解有一个 value 属性。

dlt77585211314的博客 393

STM32F429移植LVGL9.3.0:从源码配置到双缓冲优化实战

本文详细介绍了如何在STM32F429平台上移植LVGL 9.3.0图形库,涵盖从源码准备、工程配置、显示驱动适配到双缓冲优化等关键步骤。重点解析了利用STM32F429的硬件特性实现高效内存管理和流畅显示性能的实战技巧,为嵌入式GUI开发提供完整解决方案。

q6r7s8t9的博客 1134

spring aop -- 获取注解值

这两天在写安全框架 但是一直用method Invocation的话有点特别麻烦,看着不爽 用注解习惯了 现在一个需求就是我要拿到这个a方法上的printLog注解的desc值@PrintLog(desc = "i am a") public void a(){ }经过搜索引擎来一遍之后 发现了这种符合我需求的方法为了省事 我定义了这个注解的方法为切点@Before(“lo

wuhulala的休息室 8822

单卡调试OpenGait:从分布式到本地的轻量级改造指南

本文为个人开发者和研究者提供了一份详细的OpenGait框架单卡调试指南。针对该框架默认依赖多GPU分布式训练的问题,文章通过分析核心痛点,逐步讲解了如何从环境搭建、绕过分布式初始化陷阱、处理通信后端报错到最终配置与调试,实现从分布式到本地的轻量级改造,帮助读者在单张GPU上高效进行步态识别模型的验证与学习。

weixin_28223453的博客 138

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader远程升级(含完整代码解析)

本文详细介绍了基于STM32F103VET6与W25Q64外部Flash的Bootloader远程升级实现方案,包含硬件选型、存储分区策略、双校验机制及完整代码解析。通过SPI接口实现固件存储与升级,适用于物联网设备开发,提升OTA功能可靠性。

weixin_42620340的博客 357

通过Aop手写一个日志框架

1.大致流程 2.编写aop采集日志 package com.example.test.aop; import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSON; import cn.hutool.json.JSONUtil; import com.example.test.utils.Log; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotatio.

wjy_0208的博客 323

python爬取巨潮资讯网所有股票年报数据

爬虫获取巨潮资讯网数据

qq_42752524的博客 6114

(十四)SpringBoot使用AOP统一处理Web请求日志添加MDC

AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 之前看到公司有的人,在业务逻辑内打印方法的请求参数,添加MDC,请求返回时再打印返回的结果,这种事可以统一写好,所有地方都用再写了

这个名字想了很久 9654

思科模拟器实战:MQTT协议实现物联网设备通信全流程解析

本文详细解析了如何在思科模拟器中利用MQTT协议实现物联网设备通信的全流程。通过搭建网络拓扑、配置MQTT Broker与客户端,并编写发布/订阅逻辑,手把手指导读者完成一个“开关控制电灯”的经典物联网场景实验,帮助零成本掌握物联网通信核心。

weixin_29294975的博客 381

LPDDR6来了!到底比LPDDR5/5X强在哪?从速度到总线,技术细节一次说清!

LPDDR6不仅仅是速度快点、位宽大点那么简单,它是一次架构级的革新,从引脚、总线、时钟管理到Burst协议全部升级。🎯我们正在迈入一个“AI优先”的时代,内存架构也必须跟上。对于做芯片、做整机、做系统的你,理解LPDDR6的技术变化,提前规划测试方案,是现在就该启动的动作!

weixin_43199439的博客 1284

【七】springboot整合AOP实现日志操作

springboot整合AOP实现日志操作

weixin_56995925的博客 1万+

YOLO11改进|注意力机制篇|引入ELA注意力机制

YOLO11添加ELA注意力机制

A1983Z的博客 3647

【SpringBoot】SpringBoot中使用AOP实现日志记录功能

AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。在传统的业务处理代码中,通常都会进行事务处理、日志记录等操作。虽然使用OOP可以通过组合或者继承的方式来达到代码的重用,但如果要实现某个功能(如日志记录),同样的代码仍然会分散到各个方法中。这样,如果想要关闭某个功能,或者对其进行修改,就必须要修改所有的相关方法。这不但增加了开发人员的工作量,而且提高了代码的出错率。

qq_61024956的博客 5970

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringBoot AOP统一处理请求日志

SpringBoot AOP统一处理请求日志有一天,项目经理老吴对小吴说:现在有这样一个需求:在SpringBootDemo01项目上的每个方法执行之前之后各打印一句话,例如:方法执行前打印如下内容:方法执行开始 方法执行后打印:方法执行完成 然后,小吴心里觉得,SpringBootDemo01项目中才不到10个方法,这个简单呀,好做嘛:直接在每个方法前后各添加一行打印输出代码就可以了。然后直接爽快

wojiushimogui的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

springboot如何使用aop统一处理请求日志、异常日志、返回日志?

springboot有很多方法处理日志,例如拦截器,aop切面,service中代码记录等。这里我们以aop切面为例: 这里要注意点是 AOP中@Pointcut切入点表达式的使用,不能使用execution(public * *(..)) ,这个代表切入全部请求,会在启动项目的时候报空指针异常,因为启动项目时候无法获取request。所以建议切入点表达式指定为controller包下的方法。 IpUtil.getIpAddr(request)方法为获取请求者的IP地址的方法,代码如下: 执行

qq_20446879的博客 4410

SpringBoot AOP处理请求日志处理打印

SpringBoot AOP处理请求日志处理打印 @Slf4j @Aspect @Configuration public class RequestAopConfig { @Autowired private HttpServletRequest request; private static final ThreadLocal<Long> START_T...

HappyLoves 823

SpringBoot自定义注解,AOP 切面统一打印出入参请求日志

①:什么时候使用该注解,我们定义为运行时;②:注解用于什么地方,我们定义为作用于方法上;③:注解是否将包含在 JavaDoc 中;④:注解名为WebLog;⑤:定义一个属性,默认为空字符串;源代码如下:到这里,一个完整的自定义注解就定义完成了。

2402_86679690的博客 2844

SpringBoot学习笔记之AOP全局统一日志管理

我们开发的 Web 系统都会有日志模块,用来记录对数据有进行变更的操作。一般都会记录请求的 URL,请求的 IP,执行的方法,操作人员等等。其目的可能是为了保留操作痕迹,防抵赖,或是记录系统运行情况,再有就是审计要求。抛开杂念,静下心来,只看当下;充电片刻,日积月累,步步向前。

蜗牛老师,专注编程领域 5669

SpringBoot用AOP统一处理请求日志

SpringBoot用AOP统一处理请求日志 有时候我们想记录请求参数,请求地址等信息,此时可以在Controller层通过日志方式直接记录,但是采用这种方式我们需要在每个方法中一一处理,代码冗余度很高;而且如果想改变日志记录内容等信息就得排查每一个方法都改一遍,可维护性差。此时,我们可以采用AOP面向切面编程的方式对请求日志进行统一处理。 1.引入Aop依赖 &amp;amp;lt;dependency&amp;amp;gt;...

小羊的小窝 421

SpringBoot 使用 AOP 切面对请求进行日志记录

SpringBoot 使用 AOP 切面对请求进行日志记录

weixin_46619605的博客 1047

SpringBoot AOP处理Web请求日志——访问接口的参数以及返回结果

准备工作 引入pom.xml依赖: <!--引入Web模块--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </depend...

XHChen的博客 4622

SpringBoot + AOP 统一处理日志

Springboot + AOP 统一处理日志。然后系统日志持久化到文件保存起来,当程序方便发生问题的时候,能够快速、准确的定位到问题的所在。SpringBoot + Log4j 每天输出一个日志文件(分级别的) 一、AOP框架AspectJ AspectJ是基于java开发的aop框架,自spring2.0以后,springaop引入对他支持。 使用aspectJ实现aop由两种方式:基于...

csdnluolei 1020

SpringBoot使用aop切面做日志收集 、处理

在项目开发中,日志收集处理是一个必不可少的功能,会做日志收集处理的人很多,但是却没有比较详细的说明和注解支持小白去学习,于是,就诞生了这篇博客,可能这边博客也不是最好的,但我相信,对未来的大佬们来说,这个多少还是有点料的 SpringBoot中做日志的方法有很多,比如用拦截器,在拦截器中进行处理需要进行收集日志的方法,同时也可以将日志存库,但是这种方法可能会有一个弊端,在拦截器中进行处理日志的话,对于请求量过大的系统,或者处理次数过多的,以及并发过高的项目来说,都是一个可怕的性能消耗。方法二,使用elk加.

qq_43757153的博客 9016
上一篇: 学习springBoot(七,进阶篇)
下一篇: Arcgis for android100.3 加载离线遥感影像数据
MagicMHD
博客等级 码龄9年 503粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值