SpringBoot统计一个Bean中方法的调用次数的实现步骤
实现思路
通过AOP即可实现,通过AOP对Bean进行代理,在每次执行方法前或者后进行几次计数统计。这个主要就是考虑好如何避免并发情况下不准,以及如何使用AOP实现代理。
前置条件
首先搭建一个spring boot工程,我这里用的是3x版本
搭建步骤:
新版idea创建springboot项目
新版idea创建spring boot项目的详细教程_java_脚本之家 (jb51.net)
导入依赖:
pom.xml:
<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; /** * @author mijiupro */ @Retention(RetentionPolicy.RUNTIME)// 指定注解的保留策略为RUNTIME @Target(ElementType.METHOD)// 指定该注解可以用于方法 public @interface MethodCallCount { }
接下来定义一个切面
通过该切面来对这个注解进行增强处理
代码如下:
import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; /** * @author mijiupro */ @Aspect// 声明这是一个切面 @Component// 声明这是一个Spring Bean(交给Spring管理) @Slf4j public class MethodCallCountAspect { // 用于存储方法调用次数的Map,使用ConcurrentMap保证线程安全 private final Map<String, AtomicInteger> counterMap = new ConcurrentHashMap<>(); @Around("@annotation(com.mijiu.commom.aop.annotation.MethodCallCount)") public Object methodCallCountAspect(ProceedingJoinPoint joinPoint) { String methodName = joinPoint.getSignature().toShortString(); try{ return joinPoint.proceed(); }catch (Throwable ignored){ //异常处理 return null; }finally { AtomicInteger counter = counterMap.computeIfAbsent(methodName,k -> new AtomicInteger(0)); counter.incrementAndGet(); log.info("方法 {} 调用次数:{}", methodName, counter.get()); } } // 提供一个方法,用于获取方法调用次数的Map public Map<String, AtomicInteger> getCounterMap() { return new ConcurrentHashMap<>(counterMap); } }
需要统计方法上使用该注解
有了以上注解和切面后,只需要在我们想要统计的方法上使用该注解就行了
测试
启动项目调用一下接口
但是需要注意的是,这个统计结果只在内存中有效,如果应用发生重启,就会归零了。如果想要持久化保存,就需要考虑持久化存储了,如存在mysql或者redis中。
另外,如果并发特别高,对统计结果要求没那么精确,可以用LongAdder替代AtomicInteger
以上就是SpringBoot统计一个Bean中方法的调用次数的实现步骤的详细内容,更多关于SpringBoot统计Bean调用次数的资料请关注脚本之家其它相关文章!
相关文章
Java通过cellstyle属性设置Excel单元格常用样式的全面总结讲解
在处理Excel文件时,经常需要对单元格进行样式设置,以满足特定的需求和美化要求,这篇文章主要给大家介绍了关于Java通过cellstyle属性设置Excel单元格常用样式的相关资料,需要的朋友可以参考下2024-01-01Spring Boot 使用 Swagger 构建 RestAPI 接口文档
这篇文章主要介绍了Spring Boot 使用 Swagger 构建 RestAPI 接口文档,帮助大家更好的理解和使用Spring Boot框架,感兴趣的朋友可以了解下2020-10-10java文件操作报错:java.io.FileNotFoundException(拒绝访问)问题
在进行编程时,经常会遇到因疏忽小细节而导致的错误,如忘记在路径后添加文件名,本文通过一个具体的修改前后对比示例,解释了错误原因,并给出了解决方案,这类经验分享对编程学习者具有参考价值2024-10-10mybatis3.3+struts2.3.24+mysql5.1.22开发环境搭建图文教程
这篇文章主要为大家详细介绍了mybatis3.3+struts2.3.24+mysql5.1.22开发环境搭建图文教程,感兴趣的小伙伴们可以参考一下2016-06-06
最新评论