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

SpringBoot之LazyInitializationBeanFactoryPostProcessor类源码学习

源码分析

/**** @author Andy Wilkinson* @author Madhura Bhave* @author Tyler Van Gorder* @author Phillip Webb* @since 2.2.0* @see LazyInitializationExcludeFilter** 主要用于延迟初始化 Bean 的配置。它通过修改 BeanFactory 的配置来确保某些 Bean 在实际需要时才进行初始化,而不是在应用启动时就全部初始化。这有助于提高应用的启动速度和资源利用率。*/
public final class LazyInitializationBeanFactoryPostProcessor implements BeanFactoryPostProcessor, Ordered {/*** 在BeanFactory初始化后对bean进行后处理* 主要用于处理延迟初始化相关的逻辑** @param beanFactory ConfigurableListableBeanFactory类型的参数,代表BeanFactory* @throws BeansException 如果处理过程中遇到错误,则抛出此异常*/@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// Take care not to force the eager init of factory beans when getting filters//获取LazyInitializationExcludeFilter类型的beanCollection<LazyInitializationExcludeFilter> filters = beanFactory.getBeansOfType(LazyInitializationExcludeFilter.class, false, false).values();//遍历容器中的所有bean定义for (String beanName : beanFactory.getBeanDefinitionNames()) {//根据beanName获取bean的定义BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);//检查bean定义是否为AbstractBeanDefinition类型if (beanDefinition instanceof AbstractBeanDefinition) {//如果是,则进行延迟初始化处理postProcess(beanFactory, filters, beanName, (AbstractBeanDefinition) beanDefinition);}}}/*** 根据条件更新bean的懒初始化状态** @param beanFactory Bean工厂,用于获取bean的相关信息* @param filters 排除懒初始化的过滤器集合* @param beanName 当前bean的名称* @param beanDefinition 当前bean的定义,包含懒初始化状态*/private void postProcess(ConfigurableListableBeanFactory beanFactory,Collection<LazyInitializationExcludeFilter> filters, String beanName,AbstractBeanDefinition beanDefinition) {// 如果bean的懒初始化状态已明确,无需处理Boolean lazyInit = beanDefinition.getLazyInit();if (lazyInit != null) {return;}// 获取bean的类型Class<?> beanType = getBeanType(beanFactory, beanName);//如果该bean不再filters列表中,则LazyInit设置为trueif (!isExcluded(filters, beanName, beanDefinition, beanType)) {//给这个bean设置延迟初始化beanDefinition.setLazyInit(true);}}private Class<?> getBeanType(ConfigurableListableBeanFactory beanFactory, String beanName) {try {return beanFactory.getType(beanName, false);}catch (NoSuchBeanDefinitionException ex) {return null;}}/*** 判断指定的bean是否被排除在懒初始化之外** @param filters 一个包含多个排除过滤器的集合,用于判断bean是否应该被排除* @param beanName bean的名称,用于在过滤时进行标识* @param beanDefinition bean的定义信息,包含了bean的元数据* @param beanType bean的类型,可能为null,用于类型级别的过滤* @return 如果bean被至少一个过滤器认定为需要排除,则返回true;否则返回false*/private boolean isExcluded(Collection<LazyInitializationExcludeFilter> filters, String beanName,AbstractBeanDefinition beanDefinition, Class<?> beanType) {// 如果bean类型不为null,遍历所有过滤器以判断bean是否应被排除if (beanType != null) {for (LazyInitializationExcludeFilter filter : filters) {// 如果当前过滤器认为bean应被排除,则直接返回trueif (filter.isExcluded(beanName, beanDefinition, beanType)) {return true;}}}// 如果没有过滤器认为bean应被排除,则返回falsereturn false;}@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}}

测试案例

class LazyInitializationExcludeFilterTests {@Testvoid forBeanTypesMatchesTypes() {// 创建一个LazyInitializationExcludeFilter,排除CharSequence和Number类型的beanLazyInitializationExcludeFilter filter = LazyInitializationExcludeFilter.forBeanTypes(CharSequence.class,Number.class);// 定义一个测试用的bean名称String beanName = "test";// 模拟一个BeanDefinition对象BeanDefinition beanDefinition = mock(BeanDefinition.class);// 验证filter是否正确排除了CharSequence类型System.out.println("验证filter是否正确排除了CharSequence类型:"+filter.isExcluded(beanName, beanDefinition, CharSequence.class));// 验证filter是否正确排除了String类型(CharSequence的子类型)System.out.println("验证filter是否正确排除了String类型(CharSequence的子类型):"+filter.isExcluded(beanName, beanDefinition, String.class));// 验证filter是否正确排除了StringBuilder类型(CharSequence的子类型)System.out.println("验证filter是否正确排除了StringBuilder类型(CharSequence的子类型):"+filter.isExcluded(beanName, beanDefinition, StringBuilder.class));// 验证filter是否正确排除了Number类型System.out.println("验证filter是否正确排除了Number类型:"+filter.isExcluded(beanName, beanDefinition, Number.class));// 验证filter是否正确排除了Long类型(Number的子类型)System.out.println("验证filter是否正确排除了Long类型(Number的子类型):"+filter.isExcluded(beanName, beanDefinition, Long.class));// 验证filter是否正确不排除Boolean类型(非Number类型)System.out.println("验证filter是否正确不排除Boolean类型(非Number类型):"+filter.isExcluded(beanName, beanDefinition, Boolean.class));}}

测试结果

验证filter是否正确排除了CharSequence类型:true
验证filter是否正确排除了String类型(CharSequence的子类型):true
验证filter是否正确排除了StringBuilder类型(CharSequence的子类型):true
验证filter是否正确排除了Number类型:true
验证filter是否正确排除了Long类型(Number的子类型):true
验证filter是否正确不排除Boolean类型(非Number类型):false

相关文章:

SpringBoot之LazyInitializationBeanFactoryPostProcessor类源码学习

源码分析 /**** author Andy Wilkinson* author Madhura Bhave* author Tyler Van Gorder* author Phillip Webb* since 2.2.0* see LazyInitializationExcludeFilter** 主要用于延迟初始化 Bean 的配置。它通过修改 BeanFactory 的配置来确保某些 Bean 在实际需要时才进行初始…...

United States of America三种表示

"United States of America", "United States", 和 "America" 都表示美国&#xff0c;但它们的使用场景和背景略有不同。以下是关于为什么这些名称可以合在一起表示美国的详细解释&#xff1a; 1. "United States of America" 全称&a…...

OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移&#xff08;Mean Shift&#xff09;算法和图像金字塔&#xff08;Image Pyramid&#xff09;的概念&#xff0c;用于图像分割和平滑处理。以下是该算法的详细原理&#xff1a; 1.1 、均值迁移&#xff08;Mean …...

【C++】拷贝构造函数与运算符重载

写在前面 拷贝构造函数、赋值运算符重载、取地址运算符都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 在程序编写中&#xff0c;我们也经常使用拷贝的方式来获取到对应的值&#xff0c;例如整形变量拷贝int a 0; i…...

2024年开发语言热度排名

随着技术的不断发展和变化&#xff0c;编程语言的热度也在不断演变。2024年即将到来&#xff0c;我们有必要回顾和展望当前和未来的开发语言市场。本文将基于多个因素&#xff0c;包括行业需求、社区支持、流行度以及新兴趋势&#xff0c;对2024年的开发语言热度进行排名和分析…...

CryptoMamba:利用状态空间模型实现精确的比特币价格预测

“CryptoMamba: Leveraging State Space Models for Accurate Bitcoin Price Prediction” 论文地址&#xff1a;https://arxiv.org/pdf/2501.01010 Github地址&#xff1a;https://github.com/MShahabSepehri/CryptoMamba 摘要 预测比特币价格由于市场的高波动性和复杂的非线…...

MQTTX客户端使用

一、MQTT服务器&#xff08; emqx &#xff09;搭建 (1) 下载服务器MQTT Broker 从https://www.emqx.com/zh/downloads/broker/5.3.0/emqx-5.3.0-windows-amd64.zip下载MQTT Broker。 这里我使用的windows系统&#xff0c;下载对应版本工具&#xff1a;emqx-5.3.0-windows-a…...

网管平台(进阶篇):路由器的管理实践

在当今数字化时代&#xff0c;路由器作为网络连接的核心设备&#xff0c;其管理对于确保网络的稳定、高效和安全至关重要。本文旨在深入探讨路由器管理的重要性、基本设置步骤、高级功能配置以及日常维护&#xff0c;帮助读者构建一个高效且安全的网络环境。 一、路由器管理的…...

基于微信小程序的智能停车场管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【Vue】父组件向子组件传递参数;子组件向父组件触发自定义事件

父组件向子组件传递参数 方法一&#xff1a;props 在 Vue 中&#xff0c;父组件向子组件传递数据主要通过props来实现&#xff0c;以下是具体的步骤&#xff1a; 父组件中传递数据 在父组件中&#xff0c;当需要调用子组件 AddSampleDialog 时&#xff0c;通过 v-bind 或其…...

搜广推校招面经七

抖音推荐算法 一、广告系统中的数据流处理方法&#xff0c;怎么避免延迟回流问题 延迟回流问题是指&#xff0c;实时系统&#xff08;如广告点击预估&#xff09;中&#xff0c;历史数据未及时更新或发生延迟&#xff0c;导致系统的实时预测偏离实际情况。避免延迟回流的方法有…...

Leetcode 518. 零钱兑换 II 动态规划

原题链接&#xff1a;Leetcode 518. 零钱兑换 II 可参考官解&#xff1a;零钱兑换 II 和这个解答&#xff1a;[Java/Python3/C]动态规划&#xff1a;拆分零钱兑换子问题&#xff08;嵌套循环的秘密&#xff09;【图解】 此题需要仔细想象和Leetcode 377. 组合总和 Ⅳ 动态规划…...

【EI 会议征稿】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)

2025 4th International Conference on Materials Engineering and Applied Mechanics 重要信息 大会官网&#xff1a;www.icmeaae.com 大会时间&#xff1a;2025年3月7-9日 大会地点&#xff1a;中国西安 截稿时间&#xff1a;2025年1月24日23:59 接受/拒稿通知&#xf…...

集合的线程安全

在多线程环境中&#xff0c;Java 的集合框架&#xff08;Collection Framework&#xff09;面临着线程安全的问题。当多个线程同时访问同一个集合对象时&#xff0c;可能会导致数据不一致、丢失更新或程序崩溃等严重问题。因此&#xff0c;在并发编程中确保集合操作的安全性至关…...

《深入理解Mybatis原理》Mybatis中的缓存实现原理

一级缓存实现 什么是一级缓存&#xff1f; 为什么使用一级缓存&#xff1f; 每当我们使用MyBatis开启一次和数据库的会话&#xff0c;MyBatis会创建出一个SqlSession对象表示一次数据库会话。 在对数据库的一次会话中&#xff0c;我们有可能会反复地执行完全相同的查询语句&…...

C# 数据拟合教程:使用 Math.NET Numerics 的简单实现

C# 数据拟合实战&#xff1a;使用 Math.NET Numerics 快速实现 引言 在科学计算、工程建模或数据分析中&#xff0c;数据拟合是一个非常重要的技术。无论是线性拟合还是非线性拟合&#xff0c;借助适当的工具都可以快速解决问题。本文将向您展示如何使用 C# 和强大的数值计算…...

C# 中对 Task 中的异常进行捕获

以下是在 C# 中对 Task 中的异常进行捕获的几种常见方法&#xff1a; 方法一&#xff1a;使用 try-catch 语句 你可以使用 try-catch 语句来捕获 Task 中的异常&#xff0c;尤其是当你使用 await 关键字等待任务完成时。 using System; using System.Threading.Tasks;class …...

Android车机DIY开发之软件篇(九)默认应用和服务修改

Android车机DIY开发之软件篇(九)默认应用和服务修改 Car默认应用位置 ~/packages/apps/Car 增加APP 1.增加 XXXX.app 和Android.mk 2. 修改~/build/make/target/product/handheld_system_ext.mk Android默认APK位置 ~/packages/apps 1.增加文件夹 app和mk文件 2.build/mak…...

SimpleFOC01|基于STM32F103+CubeMX,移植核心的common代码

导言 如上图所示&#xff0c;进入SimpleFOC官网&#xff0c;点击Github下载源代码。 如上图所示&#xff0c;找到仓库。 comom代码的移植后&#xff0c;simpleFOC的移植算是完成一大半。simpleFOC源码分为如下5个部分&#xff0c;其中communication是跟simpleFOC上位机通讯&a…...

web.xml常用配置

web.xml是Java Web应用程序的部署描述文件&#xff0c;它位于WEB-INF目录下。web.xml文件主要用于配置Servlet、Filter、Listener、MIME类型、欢迎页面等组件&#xff0c;以及一些Web应用的上下文参数。以下是一些常见的web.xml配置说明&#xff1a; Servlet配置&#xff1a; …...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...