首页 > 其他分享 >使用 BeanPostProcessor 进行 bean 初始化增强

使用 BeanPostProcessor 进行 bean 初始化增强

时间:2024-11-24 10:22:00浏览次数:4  
标签:BeanPostProcessor 初始化 long bean startTime public

简介

BeanPostProcessor是 Spring 框架中的一个接口,用于在 Spring 容器初始化 bean 之前和之后进行一些自定义操作。它允许开发者对 bean 的实例化过程进行干预,通常用于修改或替换 bean 的属性、执行特定的初始化逻辑等。下面是接口定义:

public interface BeanPostProcessor {

	@Nullable
	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

	@Nullable
	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
		return bean;
	}

}

BeanPostProcessor接口提供了两个方法:postProcessBeforeInitialization()postProcessAfterInitialization()。在 Spring 容器初始化 bean 之前,postProcessBeforeInitialization()方法会被调用,在 bean 初始化之后,postProcessAfterInitialization()方法会被调用。

下面演示如何使用BeanPostProcessor来记录 bean 的初始化时间。

实现步骤

  1. 创建自定义的BeanPostProcessor

    这个处理器将在 bean 初始化前后记录时间,并计算初始化所需的时间。

    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.stereotype.Component;
    
    @Component
    public class InitializationTimeLogger implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            // 记录初始化开始时间
            long startTime = System.currentTimeMillis();
            bean.getClass().getDeclaredFields(); // 这里可以做一些初始化前的操作
            // 将开始时间存储在 bean 的属性中
            if (bean instanceof TimedBean) {
                ((TimedBean) bean).setStartTime(startTime);
            }
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            // 记录初始化结束时间
            long endTime = System.currentTimeMillis();
            if (bean instanceof TimedBean) {
                long startTime = ((TimedBean) bean).getStartTime();
                long duration = endTime - startTime;
                System.out.println("Bean '" + beanName + "' 初始化耗时: " + duration + " 毫秒");
            }
            return bean;
        }
    }
    
  2. 定义一个接口或基类

    为了能在BeanPostProcessor中访问初始化时间,我们可以定义一个接口或基类,所有需要记录时间的 bean 都实现这个接口。

    public interface TimedBean {
        void setStartTime(long startTime);
        long getStartTime();
    }
    
  3. 实现接口的 bean 类

    让需要记录初始化时间的 bean 实现TimedBean接口。

    import org.springframework.stereotype.Component;
    
    @Component
    public class MyService implements TimedBean {
        private long startTime;
    
        @Override
        public void setStartTime(long startTime) {
            this.startTime = startTime;
        }
    
        @Override
        public long getStartTime() {
            return startTime;
        }
    
        public void performAction() {
            // 执行某些操作
            System.out.println("Performing action...");
        }
    }
    

运行效果

当 Spring 容器启动并初始化MyService时,控制台将输出类似以下的初始化时间信息:

Bean 'myService' 初始化耗时: 12 毫秒

总结

通过实现BeanPostProcessor,我们能够在 bean 初始化的前后记录时间,从而计算出初始化所需的时间。这种方法可以帮助我们监控和优化应用的性能。

标签:BeanPostProcessor,初始化,long,bean,startTime,public
From: https://www.cnblogs.com/Higurashi-kagome/p/18565487

相关文章

  • 学习笔记(四十三):@BuilderParam装饰器初始化组件的三种方式
    一、参数初始化组件@BuilderParam装饰的方法可以是有参数和无参数的两种形式,需与指向的@Builder方法类型匹配1、定义一个类作为参数//定义一个对象,ui需要的数据exportclassViewEntity{content:string="sssss";}2、定义一个自定义组件import{ViewEntity}from......
  • Spring 源码学习(五)—— 对象注册表(BeanDefinition)
    一注册表存储器1 BeanDefinitionHolder类1.1属性及构造方法1.1.1属性变量    由于BeanDefinitionHolder类的目的主要是用于保存 BeanDefinition对象,因此其拥有的一个最重要的属性是用于保存内部 BeanDefinition对象的 beanDefinition属性;同时还保存了......
  • 标准javabean
    1.javabean介绍javabean,名为实体类,封装数据的类前面我们写的类都是实体类,但我们写的不是标准的实体类.2.标准的javabean写法如图3.快捷键一个成员变量就要写两个方法(set和get),那十个就要写20个方法,实在过于麻烦,所以我们下载一个插件,用于快速产生无参、有参构造方法和set、......
  • Abaqus2020/Contact新功能(1):干涉配合和初始化
    本文摘要(由AI生成):这篇文档主要介绍了Abaqus/Explicit中新增的干涉配合和通用接触中的初始化控制功能。干涉配合方面,Abaqus/Explicit提供了在首个分析步中逐步消除初始穿透的功能,并通过螺纹接触实例进行了说明。结果显示,除了应力集中区域以及奇异点的值外,Abaqus/Explicit和......
  • c语言程序块中初始化变量对同名变量作用域的影响
     001、[root@PC1test1]#lstest1.ctest2.c[root@PC1test1]#cattest1.c#include<stdio.h>intmain(void){inti;intx=10000;for(i=0;i<4;i++){intx=i*5;printf(......
  • 简单说说 Bean的生命周期源码
    在spring中核心进行bean的初始化的方法是AbstractAutowireCapableBeanFactory类的doCreateBean方法,生命周期的全部大致流程都在这里进行了描述分别是:1创建实例;2填充属性3初始化//AbstractAutowireCapableBeanFactory类//创建bean的过程protectedObjectdoCreateB......
  • [Spring]——IOC,DI,Bean的生命周期
    目录一.反转(转移)控制(IOC)二.DI依赖注入三.bean的生命周期1.对象的生命周期2.为什么要学习生命周期3.生命周期的三个阶段(1)创建(2)初始化方法两种实现方法细节问题(3)销毁(资源释放的操作)两种实现方法(和初始化的差不多)细节分析4.对象生命周期的总结完整代码5.后置处......
  • 云天社区管理平台---项目初始化
    云天社区管理平台---项目初始化环境配置准备工作创建项目项目结构四、运行和调试正式开发创建项目预览项目修改布局效果展示环境配置准备工作安装HUAWEIDevEcoStudioDevEcoStudio是基于IntelliJIDEACommunity开源版本打造,为运行在HarmonyOS和OpenHarmony......
  • FactoryBean(利用工厂制造复杂的bean)
    可以说FactoryBean创建的对象的生命周期管理取决于其是否为单例对象以及是否实现了特定的生命周期管理接口。对于单例对象,生命周期由Spring容器管理;而对于多例对象,生命周期由Java虚拟机管理。容器仅负责管理FactoryBean实例的生命周期,而不负责FactoryBean所创建对象......
  • spring上 -基于注解配置bean,动态代理,AOP笔记
     用的是jdk8,spring框架里jar包的下载可以自己搜到注解用到的jar包。  60,注解配置Bean快速入门 基本介绍 代码结构: UserDao.javapackagecom.hspedu.spring.component;importorg.springframework.stereotype.Repository;/**使用@Repository标识该......