通过注解统计接口调用耗时

本文详细描述了如何在SpringBoot项目中使用AOP框架(如SpringAOP和AspectJ)创建自定义注解@Timing,以记录方法执行时间并监控接口调用耗时。通过在切面类中使用@Around注解,实现对带有@Timing注解的方法进行拦截并记录日志。

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


要通过注解统计接口调用耗时,可以按照以下步骤进行操作:

  1. 首先,在您的项目中引入一个AOP(面向切面编程)框架,比如Spring AOP或AspectJ。这些框架可以帮助您在方法执行前后插入额外的逻辑。

  2. 创建一个自定义的注解,用于标记需要被统计耗时的方法。例如,您可以创建一个名为@Timing的注解。

  3. 在AOP配置文件中,定义一个切面(Aspect),并使用切点表达式匹配包含@Timing注解的方法。切点表达式可以筛选出带有@Timing注解的方法,以便后续对其进行处理。

  4. 在切面中,使用@Around注解的方法中记录方法执行开始时间和结束时间,并计算耗时。

  5. 可以将耗时信息记录到日志中或者其他适当的位置,以供后续分析和监控。

  • 创建一个Spring Boot项目,引入以下依赖(pom.xml):
<dependencies>
    <!--其他依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--其他依赖-->
</dependencies>
  • 创建一个自定义注解@Timing,用于标记需要统计耗时的方法。
package com.example.demo.aspect;

import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Timing {
}
  • 创建一个切面类TimingAspect,用于处理被@Timing注解标记的方法。
package com.example.demo.aspect;

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;

@Aspect
@Component
public class TimingAspect {
    private static final Logger LOGGER = LoggerFactory.getLogger(TimingAspect.class);

    @Around("@annotation(com.example.demo.aspect.Timing)")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long endTime = System.currentTimeMillis();
        LOGGER.info("{} executed in {} ms", joinPoint.getSignature(), endTime - startTime);
        return result;
    }
}
  • 创建一个Controller类,其中的方法使用@Timing注解标记。
package com.example.demo.controller;

import com.example.demo.aspect.Timing;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyController {
    @GetMapping("/hello")
    @Timing
    public String hello() {
        // 模拟耗时操作
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "Hello, World!";
    }
}
  • 在启动类上添加@EnableAspectJAutoProxy注解,开启AOP代理。
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@EnableAspectJAutoProxy
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

 当访问 ​http://localhost:8080/hello​时,TimingAspect中的logExecutionTime方法将会在接口执行前后打印日志,并记录接口调用耗时。


### 实现Spring接口调用时间监控 为了实现对接口调用时间的监控,在Spring应用中可以利用AOP(面向切面编程)来拦截方法执行并记录耗时。下面展示一种使用`@Aspect`的方式来进行此操作。 #### 利用AOP实现接口耗时统计 创建一个切面类用于处理所有目标方法的时间测量: ```java import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; @Component @Aspect public class ExecutionTimeTracker { @Around("@annotation(org.springframework.web.bind.annotation.RequestMapping)") public Object trackExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); try { return joinPoint.proceed(); // 执行被拦截的方法 } finally { long elapsedTime = System.currentTimeMillis() - start; String methodName = joinPoint.getSignature().getName(); // 输出日志或其他形式保存数据 System.out.println("Method [" + methodName + "] took " + elapsedTime + "ms"); } } } ``` 上述代码定义了一个名为`trackExecutionTime`的方法,它会在任何带有@RequestMapping注解的方法周围建立环绕通知[@Around]。当这些方法被执行时,会先记录当前时间戳作为起点;待方法完成之后再计算经过了多少毫秒,并打印出来或存储到其他地方以便后续分析[^1]。 对于更复杂的场景,比如想要针对特定包下的所有控制器或者只对某些具有特殊标记的服务层组件进行性能监测,则可以通过调整切入点表达式的匹配规则来达成目的。 另外,如果希望进一步增强功能,还可以考虑引入像Micrometer这样的库与Prometheus、Grafana等外部系统集成,从而获得更加全面深入的应用程序健康状况视图以及历史趋势图表支持[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值