AOP记录Service方法执行时间

本文介绍如何使用Spring Boot AOP实现对Service层方法执行时间的监控,通过前置、后置通知和切点表达式,实现根据不同执行时间打印不同级别的日志,如超时警告、正常运行信息和异常处理。
AOP为Aspect Oriented Programming
Aspect:切面
OOP:面向对象编程 Object Oriented Programming
AOP的底层核心,就是Java的动态代理机制,AOP中有几个很重要的概念,整理如下表:
AOP中注解的含义
@Aspect:切面。表示一个横切进业务的一个对象。它里面包含切入点(Pointcut)和Advice(通知)。
@Pointcut:切入点。表示需要切入的位置,比如某些类或者某些方法,也就是先定一个范围。
AOP通知:
1、前置通知@Before:在方法调用之前执行
2、后置通知@AfterReturning:在方法正常调用之后执行
3、环绕通知@Around:在方法调用之前和之后,都分别可以执行的通知
4、异常通知@AfterThrowing:如果在方法调用过程中发生异常,则通知
5、最终通知 @After:在方法调用之后执行,类似于finally
其中每一个注解,都需要指定一个execution切面表达式,即该切面作用在哪一个方法之中,样例如下:

Service层是写业务逻辑,最核心的代码都在Service层,现在想知道Service层下所有的方法执行的时间,找出那些执行时间长的方法,去优化:
1、如果执行时间超过3秒,打印一个error级别的log
2、如果执行时间2-3秒,打印一个warn级别的log
3、如果执行时间小于2秒,打印一个info级别的log
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

 

### Java AOP 实现记录方法执行时间 为了实现通过AOP记录Java应用程序中的方法执行时间,可以采用`@AspectJ`风格的配置方式,在Spring框架下定义切面逻辑。下面是一个具体的例子说明如何利用`@Around`通知完成这一功能。 #### 定义日志切面类 创建一个名为LoggingAspect的日志切面类并标注为组件以便于自动扫描发现它: ```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 LoggingAspect { @Around("execution(* com.example.service..*(..))") // 切入点表达式匹配特定包下的所有方法 public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); try { return joinPoint.proceed(); // 继续执行目标方法 } finally { long executionTime = System.currentTimeMillis() - start; System.out.printf("%s executed in %d ms%n", joinPoint.getSignature(), executionTime); } } } ``` 这段代码展示了如何使用`@Around`注解包裹住实际的目标方法调用,并在其前后添加额外的行为——这里是在方法开始前获取当前时间戳,在结束后再次读取并与前者相减得到总耗时[^1]。 #### 配置文件设置 确保项目中有适当的应用上下文配置以支持AOP特性。如果使用的是基于XML的方式,则需在`applicationContext.xml`中加入如下片段启用全局代理模式以及指定要加载哪些Bean作为方面: ```xml <aop:aspectj-autoproxy /> <context:component-scan base-package="com.example"/> ``` 对于现代版本的Spring应用来说,更推荐完全依赖注解驱动的方式来简化配置过程;此时只需确认已开启组件扫描即可[^2]。 #### 测试验证效果 编写简单的单元测试或者控制台程序去触发受监控的服务接口操作,观察输出结果是否包含了预期的时间统计信息。例如上述提到的例子中,当调用了`us.a()`或`us.b(int)`这样的服务函数之后,应该能在终端看到形如“methodX executed in Y ms”的提示语句[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值