Spring Boot统计一个Bean中方法的调用次数

简介: Spring Boot统计一个Bean中方法的调用次数

实现思路

通过AOP即可实现,通过AOP对Bean进行代理,在每次执行方法前或者后进行几次计数统计。这个主要就是考虑好如何避免并发情况下不准,以及如何使用AOP实现代理。

前置条件

首先搭建一个spring boot工程,我这里用的是3x版本

搭建步骤:

导入依赖:

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

目录
相关文章
|
9月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
579 26
|
6月前
|
人工智能 前端开发 JavaScript
SpringBoot实现网页消息推送的5种方法
本文详细介绍了在SpringBoot中实现网页消息推送的几种主流方案,包括短轮询、长轮询、SSE(Server-Sent Events)、WebSocket以及STOMP。每种方案各有优缺点,适用于不同的场景需求。短轮询简单易实现但效率低;长轮询提升了实时性但仍有限制;SSE适合单向通信且轻量高效;WebSocket支持全双工通信,适合高实时性要求的场景;STOMP基于WebSocket,提供更高级的消息传递功能。通过对比分析,开发者可根据业务需求、性能要求及浏览器兼容性选择最适合的技术方案,同时可结合多种技术实现优雅降级,优化用户体验。
1104 57
|
7月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
621 5
|
7月前
|
Java Spring 容器
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
526 2
|
9月前
|
人工智能 自然语言处理 Java
Spring 集成 DeepSeek 的 3大方法(史上最全)
DeepSeek 的 API 接口和 OpenAI 是兼容的。我们可以自定义 http client,按照 OpenAI 的rest 接口格式,去访问 DeepSeek。自定义 Client 集成DeepSeek ,可以通过以下步骤实现。步骤 1:准备工作访问 DeepSeek 的开发者平台,注册并获取 API 密钥。DeepSeek 提供了与 OpenAI 兼容的 API 端点(例如),确保你已获取正确的 API 地址。
Spring 集成 DeepSeek 的 3大方法(史上最全)
|
11月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
353 73
|
10月前
|
缓存 NoSQL Java
springboot怎么使用rides缓存方法的返回值 完整例子
通过上述步骤,我们成功地在 Spring Boot 项目中集成了 Redis 缓存,并通过注解的方式实现了方法返回值的缓存。这种方式不仅提高了系统的性能,还简化了缓存管理的复杂度。使用 Spring Boot 的缓存注解和 Redis,可以轻松地实现高效、可靠的缓存机制。
196 23
|
11月前
|
存储 Java Spring
【Spring】获取Bean对象需要哪些注解
@Conntroller,@Service,@Repository,@Component,@Configuration,关于Bean对象的五个常用注解
200 12
|
11月前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
248 12
|
11月前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
311 6

热门文章

最新文章

下一篇
开通oss服务