springboot中通过aop的形式获取方法执行时间

本文介绍了在SpringBoot中使用AOP记录方法执行时间时遇到的问题,当方法内抛出异常时,AOP切面的异常会覆盖方法内部的自定义异常。为了解决这个问题,作者提出了使用原始方法来实现既保留异常信息又能获取执行时间的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

老大让本人写一个方法,获取controller中的每个方法的执行时间,大于一定时间的抓出来,后期做优化。
网上找了一些方法,特此记录一下。

注意:这里需要各位同学对springboot有一定的了解。


话不多说,直接上代码:

aspect类:

package com.fengye.aspect;

import com.fengye.common.enums.ResultEnum;
import com.fengye.exception.MethodRunningTimeException;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @Description Aop切面类
 * @Author ZF
 * @Time 2017/8/14 11:12
 */
@Aspect
@Slf4j
@Component
public class HttpAspect {
   
   

    /**
     * 切入点
     */
    @Pointcut("execution( * com.fengye.controller.*.*.*(..))")
    public void aopPointCut() {}

    /**
     * 统计方法耗时环绕通知
     * @param joinPoint
     */
    @Around("aopPointCut()")
    public Object timeAround(ProceedingJoinPoint 
### 实现带参数的AOP 在Spring Boot中实现带有参数传递功能的AOP主要涉及几个方面:配置依赖、定义切面以及编写切入点表达式来捕获目标方法及其参数。 #### 配置Maven项目中的依赖项 为了使应用程序能够利用AOP特性,需向`pom.xml`文件添加如下所示的依赖声明: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 此操作确保了应用具备必要的库来进行面向切面编程[^2]。 #### 定义切面类与通知逻辑 创建一个新的Java类作为切面,在其中通过`@Aspect`注解标记该类为一个切面组件,并注册到Spring容器内。下面是一个简单的例子展示如何获取并验证传给某个服务层接口的方法调用时所携带的具体参数值: ```java package com.example.demo; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Component @Aspect public class ParameterValidationAspect { @Before("@annotation(com.example.demo.ValidateParam)") public void validateParameters(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); // 对接收到的参数执行自定义校验规则... System.out.println("Method arguments are:"); for (Object arg : args){ System.out.println(arg); } } } ``` 上述代码片段展示了怎样拦截标注有`ValidateParam`自定义注解的目标方法之前的行为;这里假设已经存在这样一个名为`ValidateParam`的注解用于指示哪些地方应该触发前置增强处理过程[^1]。 #### 使用自定义注解装饰待监控的服务端点 接下来可以在任何希望启用参数检验的地方简单地加上刚才提到过的那个自定义注解即可: ```java package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController class HelloController { @GetMapping("/hello") @ValidateParam String hello(@RequestParam(value="name", required=false, defaultValue="World") String name) { return "Hello, " + name; } } ``` 当访问路径匹配上`/hello`且附带查询字符串形式的名字参数时,上面这段控制器里的处理器函数将会被执行前先经历由前面定义好的切面负责实施的一系列预处理动作——即打印出所有输入变量的内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值