AOP切面编程,统计接口耗时

文章介绍了如何在Java中创建一个自定义注解`@CostTime`来追踪接口的执行耗时,利用SpringAOP的`@Aspect`进行环绕通知,从而在每个注解的方法执行前后记录时间差,以便于监控和优化超过1秒的接口。这种方法能帮助开发者定位并处理高延迟问题。

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

最近开发要求接口响应时间不能超过1s,在此写了一个耗时注解,直接注解到接口方法上

添加一个annotation

@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CostTime {
}

添加aspect

最开始此处添加了异常捕获造成接口获取不到异常消息或者获取不到自定义消息

@Aspect
@Component
@Slf4j
public class CostTimeAspect {
	//此处修改为完整包路径
    @Pointcut("@annotation(cn.*.annotation.CostTime)")
    public void costTime(){}

    @Around("costTime()")
    public Object costTimeAround(ProceedingJoinPoint joinPoint) throws Throwable {
        Object obj = null ;
        Long beginTime = System.currentTimeMillis() ;
        obj = joinPoint.proceed() ;
        //获取识别信息
        String className = joinPoint.getSignature().getDeclaringTypeName() ;
        String methodName = joinPoint.getSignature().getName();
        //耗时
        Long useTime = System.currentTimeMillis()-beginTime ;
        log.info("类:[{}],方法:[{}] ,接口耗时:[{}ms]",className,methodName,useTime);
        return obj ;
    }
}

调用

    @ApiOperation("详情")
    @GetMapping("/info/{serial}")
    @ApiResponses({
            @ApiResponse(code = 200,message = "ok",response = MaterialInfoRes.class)
    })
    @CostTime
    public Result info(@PathVariable("serial")String serial){
        MaterialInfoRes res = materialService.info(serial) ;
        return Result.ok().put("data",res) ;
    }

调用结果

在这里插入图片描述
针对耗时多的接口再细分析处理

### AOP切面编程总结与最佳实践 #### 1. **AOP的核心概念** AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,用于将横切关注点(Cross-Cutting Concerns),如日志记录、事务管理和安全控制等,从业务逻辑中分离出来。这种设计提高了代码的模块化程度和可维护性[^2]。 以下是AOP的关键术语及其作用: - **Joinpoint(连接点)**: 类中的方法或字段,表示可以在哪些地方插入额外的行为。 - **Pointcut(切入点)**: 定义了一组匹配的连接点集合,通常通过表达式指定。 - **Advice(通知/增强处理)**: 描述在某个特定的连接点处应该采取的动作,分为前置通知(`@Before`)、后置返回通知(`@AfterReturning`)、最终通知(`@After`)、环绕通知(`@Around`)以及异常抛出通知(`@AfterThrowing`)[^3]。 - **Aspect(切面)**: 将切入点和通知结合起来形成的一个实体,代表了一个具体的横切功能。 - **Target Object(目标对象)**: 被代理的对象,也就是需要增强的目标类实例。 #### 2. **AOP的技术实现原理** AOP主要依赖于动态代理机制来完成其功能。Spring框架提供了两种类型的代理支持:基于JDK动态代理和CGLIB字节码生成技术。当目标类实现了接口时,默认会采用JDK动态代理;如果没有实现任何接口,则使用CGLIB代理[^4]。 #### 3. **AOP的应用场景** AOP广泛应用于各种业务需求中,常见的应用场景包括但不限于以下几个方面: - 日志记录:自动捕获操作前后的状态变化并记录下来以便后续分析。 - 性能监控:测量函数运行耗时或者资源占用情况。 - 权限验证:确保只有授权用户才能调用某些敏感服务。 - 缓存管理:减少重复计算开销提升响应速度。 - 统一异常处理:集中定义错误处理器简化开发流程[^1]。 #### 4. **AOP的最佳实践建议** ##### (1)合理选择切入点 为了保持系统的清晰性和扩展性,在定义切入点时应尽可能精确地描述所需的拦截范围,而不是盲目扩大覆盖面积。这不仅有助于降低不必要的性能损耗,还能让未来的维护工作更加轻松高效[^5]。 ##### (2)优先考虑声明式配置而非侵入式编码 利用XML文件或者Java注解的方式来设置切面规则相比直接修改源代码更为灵活便捷。例如,可以通过简单的标签调整就改变行为模式而不必重新编译整个项目结构[^5]。 ##### (3)注意线程安全性问题 由于多个请求可能会共享同一个代理实例,因此编写的通知逻辑必须具备良好的线程隔离特性以防数据污染风险发生。特别是涉及到全局变量存储临时信息的情况下更需谨慎对待。 ##### (4)避免过度滥用AOP 虽然AOP能够很好地解决许多跨领域的问题,但它并不是万能药方。对于那些非常简单直白的任务而言,可能传统的顺序执行方式反而更加直观易懂且效率更高一些。所以应当权衡利弊后再决定是否引入这一层抽象层次[^1]。 ```java // 示例代码展示如何定义一个基本的日志记录切面 import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logBefore() { System.out.println("Method is about to execute..."); } } ``` 相关问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值