SpringBoot统计一个Bean中方法的调用次数的实现步骤

 更新时间:2024年01月28日 09:03:46   作者:蒾酒  
这篇文章主要给大家介绍了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单元格常用样式的全面总结讲解

    Java通过cellstyle属性设置Excel单元格常用样式的全面总结讲解

    在处理Excel文件时,经常需要对单元格进行样式设置,以满足特定的需求和美化要求,这篇文章主要给大家介绍了关于Java通过cellstyle属性设置Excel单元格常用样式的相关资料,需要的朋友可以参考下
    2024-01-01
  • Spring Boot 使用 Swagger 构建 RestAPI 接口文档

    Spring Boot 使用 Swagger 构建 RestAPI 接口文档

    这篇文章主要介绍了Spring Boot 使用 Swagger 构建 RestAPI 接口文档,帮助大家更好的理解和使用Spring Boot框架,感兴趣的朋友可以了解下
    2020-10-10
  • Spring实战之类级别缓存实现与使用方法

    Spring实战之类级别缓存实现与使用方法

    这篇文章主要介绍了Spring实战之类级别缓存实现与使用方法,结合实例形式分析了Spring类级别缓存配置、属性、领域模型等相关操作技巧,需要的朋友可以参考下
    2020-01-01
  • SpringBoot彩色日志配置方式

    SpringBoot彩色日志配置方式

    这篇文章主要介绍了SpringBoot彩色日志配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Spring Boot JPA如何把ORM统一起来

    Spring Boot JPA如何把ORM统一起来

    Spring Data JPA 是 Spring 基于 ORM 框架、JPA 规范的基础上封装的一套JPA应用框架,可使开发者用极简的代码即可实现对数据的访问和操作,本文给大家详细介绍了Spring Boot JPA如何把ORM统一起来,感兴趣的朋友一起看看吧
    2018-04-04
  • Windows下apache ant安装、环境变量配置教程

    Windows下apache ant安装、环境变量配置教程

    这篇文章主要介绍了Windows下apache ant安装、环境变量配置教程,ANT的安装很简单,本文同时讲解了验证安装是否成功的方法和使用方法实例,需要的朋友可以参考下
    2015-06-06
  • spring4新特性之web开发增强

    spring4新特性之web开发增强

    这篇文章主要介绍了spring4新特性之web开发增强的相关资料,需要的朋友可以参考下
    2017-09-09
  • java文件操作报错:java.io.FileNotFoundException(拒绝访问)问题

    java文件操作报错:java.io.FileNotFoundException(拒绝访问)问题

    在进行编程时,经常会遇到因疏忽小细节而导致的错误,如忘记在路径后添加文件名,本文通过一个具体的修改前后对比示例,解释了错误原因,并给出了解决方案,这类经验分享对编程学习者具有参考价值
    2024-10-10
  • 一篇文中细看Java多线程的创建方式

    一篇文中细看Java多线程的创建方式

    随着计算机的配置越来越高,我们需要将进程进一步优化,细分为线程,充分提高图形化界面的多线程的开发,这篇文章主要给大家介绍了如何通过一篇文中细看Java多线程的创建方式,需要的朋友可以参考下
    2021-07-07
  • mybatis3.3+struts2.3.24+mysql5.1.22开发环境搭建图文教程

    mybatis3.3+struts2.3.24+mysql5.1.22开发环境搭建图文教程

    这篇文章主要为大家详细介绍了mybatis3.3+struts2.3.24+mysql5.1.22开发环境搭建图文教程,感兴趣的小伙伴们可以参考一下
    2016-06-06

最新评论