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

Spring系列 BeanPostProcessor

文章目录

  • BeanPostProcessor
    • 注册时机
    • 执行时机
  • InstantiationAwareBeanPostProcessor
  • SmartInstantiationAwareBeanPostProcessor


本文源码基于spring-beans-5.3.31
参考:https://docs.spring.io/spring-framework/reference/core/beans/factory-extension.html#beans-factory-extension-bpp


BeanPostProcessor 是 Spring 框架中的一个接口,用于在 bean 实例化和初始化过程中进行一些回调处理,可以对Bean进行一些扩展或修改。

在这里插入图片描述

BeanPostProcessor

注册时机

AbstractApplicationContext#refresh里进行注册。此时所有Bean的配置信息都已解析并加载完毕

在这里插入图片描述
注册时并未区分BeanPostProcessor具体是什么类型

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

AbstractBeanFactory维护了一个BeanPostProcessor列表,保存所有注册的 BeanPostProcessor

在这里插入图片描述
同时针对后期的使用提供了BeanPostProcessorCache这个类,用于缓存不同类型的BeanPostProcessor,从而进行不同的处理逻辑
在这里插入图片描述
通过懒加载策略进行初始化

BeanPostProcessorCache getBeanPostProcessorCache() {synchronized (this.beanPostProcessors) {BeanPostProcessorCache bppCache = this.beanPostProcessorCache;if (bppCache == null) {bppCache = new BeanPostProcessorCache();// 区分不同的实现类型,放到对应的list集合中for (BeanPostProcessor bpp : this.beanPostProcessors) {if (bpp instanceof InstantiationAwareBeanPostProcessor) {bppCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bpp);if (bpp instanceof SmartInstantiationAwareBeanPostProcessor) {bppCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bpp);}}if (bpp instanceof DestructionAwareBeanPostProcessor) {bppCache.destructionAware.add((DestructionAwareBeanPostProcessor) bpp);}if (bpp instanceof MergedBeanDefinitionPostProcessor) {bppCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bpp);}}this.beanPostProcessorCache = bppCache;}return bppCache;}
}

执行时机

BeanPostProcessor提供了Bean的生命周期的一些回调操作,所以它的执行是伴随着Bean的生命周期执行而执行的

在这里插入图片描述

InstantiationAwareBeanPostProcessor

org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor扩展了 BeanPostProcessor,用于在 bean 实例化和初始化过程中进行更细粒度的处理。

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {return null;}default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {return true;}@Nullabledefault PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {return null;}@Deprecated@Nullabledefault PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {return pvs;}
}

它提供了多个方法,下面是各个方法的作用

  1. postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
    在 bean 实例化之前调用。可以用于检查 bean 的元数据,决定是否需要实例化该 bean,或者返回一个替代的实例。可以返回一个替代的 bean 实例,或者返回 null 继续正常的实例化流程。

在这里插入图片描述

  1. postProcessAfterInstantiation(Object bean, String beanName)
    在 bean 实例化之后调用,可以用于逻辑处理,比如检查 bean 是否需要进行某些初始化操作。通常返回 true,表示允许继续进行属性填充。如果返回 false,则 Spring 将跳过属性的设置。

在这里插入图片描述

  1. postProcessProperties(PropertyValues pvs, Object bean, String beanName)
    在填充 bean 属性之前调用,用于处理 PropertyValues。可以修改属性值或条件性地填充属性。
    参数pvs 是待填充的属性值,bean 是当前的 bean 实例,beanName 是 bean 的名称。返回修改后的 PropertyValues,或者返回原始的 pvs。

在这里插入图片描述
4. postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName)

在这里插入图片描述

由于继承了BeanPostProcessor,所以postProcessBeforeInitialization(Object bean, String beanName)和postProcessAfterInitialization(Object bean, String beanName)这两个方法和BeanPostProcessor一致

SmartInstantiationAwareBeanPostProcessor

public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {@Nullabledefault Class<?> predictBeanType(Class<?> beanClass, String beanName) throws BeansException {return null;}@Nullabledefault Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)throws BeansException {return null;}default Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {return bean;}
}
  1. Class<?> predictBeanType(Class<?> beanClass, String beanName)

在这里插入图片描述

  1. Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName)

在这里插入图片描述

  1. Object getEarlyBeanReference(Object bean, String beanName)

在 bean 实例化后、初始化之前调用,允许返回早期的 bean 引用。这可以解决循环依赖问题,特别是在需要提前获取 bean 的情况下。返回早期的 bean 实例,或原始的 bean(即不做任何更改)。
在这里插入图片描述

http://www.lryc.cn/news/450419.html

相关文章:

  • Qualitor processVariavel.php 未授权命令注入漏洞复现(CVE-2023-47253)
  • SpringBoot的概述与搭建
  • 视频集成与融合项目中需要视频编码,但是分辨率不兼容怎么办?
  • kafka 换盘重平衡副本 操作流程
  • vue3.0 + element plus 全局自定义指令:select滚动分页
  • HarmonyOS/OpenHarmony 离线加载web资源,并实现web资源更新
  • 【Spark 实战】基于spark3.4.2+iceberg1.6.1搭建本地调试环境
  • TCP连接建立中不携带数据的报文段为何不消耗序号解析
  • JS设计模式之状态模式:优雅地管理应用中产生的不同状态
  • C语言系列4——指针与数组(1)
  • JS网页设计案例
  • 4.2.1 通过DTS传递物理中断号给Linux
  • 常用性能优化方法
  • 上海我店:创新模式引领本地生活新风尚
  • 【微服务】前端微服务qiankun 2.x主子应用通信代码片段
  • 高级java每日一道面试题-2024年9月30日-算法篇-LRU是什么?如何实现?
  • CSS选择器的全面解析与实战应用
  • vue3自动暴露element-plus组件的ref
  • 龙芯+FreeRTOS+LVGL实战笔记(新)——10蜂鸣器嘀嘀嘀
  • 微信小程序-数据模型与动态赋值
  • 【Redis】Linux下安装配置及通过C++访问Redis
  • Python 入门教程(4)数据类型 | 4.7、元组
  • Temu正在吸引越来越多的亚马逊卖家,这个市场Temu蝉联下载榜首
  • 设计原则模式概览
  • 高级主题:接口性能测试与压力测试
  • python绘制图像
  • 如何修复变砖的手机并恢复丢失的数据
  • 服务器使用了代理ip,遇到流量攻击,会对服务器有影响吗
  • 从存储到人工智能洞察: 利用 MinIO 和 Polars 简化数据管道
  • 只需要 1 分钟语音数据实现声音克隆