SpringBoot之统计接口执行耗时

实现功能:使用AOP统计方法执行耗时

Maven依赖:

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

自定义注解(加上该注解的方法系统自动统计耗时):

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 统计耗时
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TakeTime {
}

TakeTimeAspect(使用AOP技术统计方法执行前后消耗时间):

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
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;
/**
* 耗时统计
*/
@Aspect
@Component
public class TakeTimeAspect {
private static final Logger logger = LoggerFactory.getLogger(TakeTimeAspect.class);
//统计请求的处理时间
ThreadLocal<Long> startTime = new ThreadLocal<>();
/**
* 带有@TakeTime注解的方法
*/
@Pointcut("@annotation(com.emi2c.mybatis.config.annotation.TakeTime)")
public void log() {
}
@Before("log()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
startTime.set(System.currentTimeMillis());
//接收到请求,记录请求内容
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//记录请求的内容
logger.info("请求URL:" + request.getRequestURL().toString());
logger.info("请求METHOD:" + request.getMethod());
}
@AfterReturning(returning = "ret", pointcut = "log()")
public void doAfterReturning(Object ret) {
//处理完请求后,返回内容
logger.info("方法返回值:" + JSON.toJSONString(ret));
logger.info("方法执行时间:" + (System.currentTimeMillis() - startTime.get()));
}
}

使用示例:

@TakeTime
@RequestMapping(value = "/test", method = RequestMethod.GET)
public List<User> findAll() {
List<User> userList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUsername("user" + i);
user.setPassword("password" + i);
userList.add(user);
}
return userList;
}
posted @   卡卡罗特琪琪  阅读(2062)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-07-13 阳哥讲面试题(五)各种锁,LockSupport,AQS
2021-07-13 给定一个数组和一个目标值,找出和为目标值的整数,并返回他们的下标
点击右上角即可分享
微信分享提示