当前位置: 首页 > news >正文

spring如何通过实现BeanPostProcessor接口计算并打印每一个bean的加载耗时

文章目录

      • 实现说明:
      • 注意事项:

要在Spring中通过BeanPostProcessor接口计算并打印每个Bean的加载耗时,我们可以利用该接口的两个回调方法记录Bean初始化前后的时间戳,然后计算时间差。

以下是实现方案:

  1. 首先创建一个实现BeanPostProcessor接口的类
  2. 使用线程安全的Map存储每个Bean的初始化开始时间
  3. postProcessBeforeInitialization中记录开始时间
  4. postProcessAfterInitialization中计算并打印耗时
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 计算并打印每个Bean的加载耗时*/
@Component
public class BeanInitializationTimer implements BeanPostProcessor {// 使用线程安全的Map存储Bean初始化开始时间private final Map<String, Long> startTimeMap = new ConcurrentHashMap<>();/*** Bean初始化之前调用,记录开始时间*/@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 记录当前时间戳作为开始时间startTimeMap.put(beanName, System.currentTimeMillis());return bean;}/*** Bean初始化之后调用,计算并打印耗时*/@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// 获取开始时间Long startTime = startTimeMap.get(beanName);if (startTime != null) {// 计算耗时long endTime = System.currentTimeMillis();long duration = endTime - startTime;// 打印Bean加载耗时信息System.out.printf("Bean '%s' 初始化完成,类型: %s,耗时: %d ms%n",beanName, bean.getClass().getSimpleName(), duration);// 移除已处理的Bean记录,释放内存startTimeMap.remove(beanName);}return bean;}
}

实现说明:

  1. 组件注册:通过@Component注解将该处理器注册为Spring组件,Spring会自动发现并使用它
  2. 时间记录
  • postProcessBeforeInitialization方法中,记录每个Bean开始初始化的时间戳
  • 使用ConcurrentHashMap确保在多线程环境下的线程安全
  1. 耗时计算
  • postProcessAfterInitialization方法中,计算当前时间与开始时间的差值
  • 打印Bean名称、类型和初始化耗时
  • 处理完成后从Map中移除记录,避免内存泄漏
  1. 使用方式:只需将该类放入Spring扫描路径下,Spring容器启动时就会自动使用该处理器,无需额外配置

注意事项:

  • 该耗时包括Bean的初始化方法(如@PostConstruct标注的方法)执行时间
  • 如果Bean没有初始化方法,耗时会非常短
  • 对于懒加载的Bean,会在第一次被获取时才会计算耗时
  • 输出结果会显示在控制台,按Bean初始化完成的顺序打印

通过这种方式,你可以很方便地监控Spring容器中所有Bean的初始化性能,识别出初始化耗时较长的Bean,为性能优化提供依据。

http://www.xdnf.cn/news/1372789.html

相关文章:

  • 如何下载MySQL小白指南 (以 Windows 为例)
  • 基础|Golang内存分配
  • 学习游戏制作记录(保存装备物品技能树和删除存档文件)8.26
  • 数据结构的线性表 之 链表
  • 深度学习——神经网络(PyTorch 实现 MNIST 手写数字识别案例)
  • 2026 届最新大数据专业毕设选题推荐,毕业设计题目汇总
  • typescript 中的访问修饰符
  • 工业数据消费迎来“抖音式”革命:TDengine IDMP 让数据自己开口说话
  • 利用3台机器搭建Kubernetes集群
  • 工业大模型五层架构全景解析:从算力底座到场景落地的完整链路
  • 《分布式任务调度中“任务重复执行”的隐性诱因与根治方案》
  • 算法练习-合并两个有序数组
  • Java大厂面试全真模拟:从Spring Boot到微服务架构实战
  • HTML应用指南:利用GET请求获取中国银行人民币存款利率数据
  • 【系统架构设计(二)】系统工程与信息系统基础中:信息系统基础
  • 数据结构青铜到王者第四话---LinkedList与链表(1)
  • [Mysql数据库] 知识点总结3
  • 深度学习:卷积神经网络(CNN)
  • Docker中如何记录非交互式连接ssh用户操作的所有命令记录?
  • QT(QTableWidget)
  • 机器学习:前篇
  • Linux系统的网络管理(二)
  • SELinux相关介绍
  • 质押、ETF、财库三箭齐发:以太坊价值逻辑的重构与演进
  • [灵动微电子 霍尔FOC MM32BIN560C]从引脚到应用
  • Ubuntu操作系统下使用mysql、mongodb、redis
  • 系统架构设计师-【2025上半年论文题目分享】
  • 探寻跨语言统一真理及其对NLP的未来启示
  • Agent实战教程:LangGraph关于智能体的架构模式与核心概念
  • 知行——同为科技24周年庆典