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" 都表示美国,但它们的使用场景和背景略有不同。以下是关于为什么这些名称可以合在一起表示美国的详细解释: 1. "United States of America" 全称&a…...
OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效
1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移(Mean Shift)算法和图像金字塔(Image Pyramid)的概念,用于图像分割和平滑处理。以下是该算法的详细原理: 1.1 、均值迁移(Mean …...
【C++】拷贝构造函数与运算符重载
写在前面 拷贝构造函数、赋值运算符重载、取地址运算符都是属于类的默认成员函数! 默认成员函数是程序猿不显示声明定义,编译器会中生成。 在程序编写中,我们也经常使用拷贝的方式来获取到对应的值,例如整形变量拷贝int a 0; i…...
2024年开发语言热度排名
随着技术的不断发展和变化,编程语言的热度也在不断演变。2024年即将到来,我们有必要回顾和展望当前和未来的开发语言市场。本文将基于多个因素,包括行业需求、社区支持、流行度以及新兴趋势,对2024年的开发语言热度进行排名和分析…...
CryptoMamba:利用状态空间模型实现精确的比特币价格预测
“CryptoMamba: Leveraging State Space Models for Accurate Bitcoin Price Prediction” 论文地址:https://arxiv.org/pdf/2501.01010 Github地址:https://github.com/MShahabSepehri/CryptoMamba 摘要 预测比特币价格由于市场的高波动性和复杂的非线…...
MQTTX客户端使用
一、MQTT服务器( emqx )搭建 (1) 下载服务器MQTT Broker 从https://www.emqx.com/zh/downloads/broker/5.3.0/emqx-5.3.0-windows-amd64.zip下载MQTT Broker。 这里我使用的windows系统,下载对应版本工具:emqx-5.3.0-windows-a…...
网管平台(进阶篇):路由器的管理实践
在当今数字化时代,路由器作为网络连接的核心设备,其管理对于确保网络的稳定、高效和安全至关重要。本文旨在深入探讨路由器管理的重要性、基本设置步骤、高级功能配置以及日常维护,帮助读者构建一个高效且安全的网络环境。 一、路由器管理的…...
基于微信小程序的智能停车场管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【Vue】父组件向子组件传递参数;子组件向父组件触发自定义事件
父组件向子组件传递参数 方法一:props 在 Vue 中,父组件向子组件传递数据主要通过props来实现,以下是具体的步骤: 父组件中传递数据 在父组件中,当需要调用子组件 AddSampleDialog 时,通过 v-bind 或其…...
搜广推校招面经七
抖音推荐算法 一、广告系统中的数据流处理方法,怎么避免延迟回流问题 延迟回流问题是指,实时系统(如广告点击预估)中,历史数据未及时更新或发生延迟,导致系统的实时预测偏离实际情况。避免延迟回流的方法有…...
Leetcode 518. 零钱兑换 II 动态规划
原题链接:Leetcode 518. 零钱兑换 II 可参考官解:零钱兑换 II 和这个解答:[Java/Python3/C]动态规划:拆分零钱兑换子问题(嵌套循环的秘密)【图解】 此题需要仔细想象和Leetcode 377. 组合总和 Ⅳ 动态规划…...
【EI 会议征稿】第四届材料工程与应用力学国际学术会议(ICMEAAE 2025)
2025 4th International Conference on Materials Engineering and Applied Mechanics 重要信息 大会官网:www.icmeaae.com 大会时间:2025年3月7-9日 大会地点:中国西安 截稿时间:2025年1月24日23:59 接受/拒稿通知…...
集合的线程安全
在多线程环境中,Java 的集合框架(Collection Framework)面临着线程安全的问题。当多个线程同时访问同一个集合对象时,可能会导致数据不一致、丢失更新或程序崩溃等严重问题。因此,在并发编程中确保集合操作的安全性至关…...
《深入理解Mybatis原理》Mybatis中的缓存实现原理
一级缓存实现 什么是一级缓存? 为什么使用一级缓存? 每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话。 在对数据库的一次会话中,我们有可能会反复地执行完全相同的查询语句&…...
C# 数据拟合教程:使用 Math.NET Numerics 的简单实现
C# 数据拟合实战:使用 Math.NET Numerics 快速实现 引言 在科学计算、工程建模或数据分析中,数据拟合是一个非常重要的技术。无论是线性拟合还是非线性拟合,借助适当的工具都可以快速解决问题。本文将向您展示如何使用 C# 和强大的数值计算…...
C# 中对 Task 中的异常进行捕获
以下是在 C# 中对 Task 中的异常进行捕获的几种常见方法: 方法一:使用 try-catch 语句 你可以使用 try-catch 语句来捕获 Task 中的异常,尤其是当你使用 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代码
导言 如上图所示,进入SimpleFOC官网,点击Github下载源代码。 如上图所示,找到仓库。 comom代码的移植后,simpleFOC的移植算是完成一大半。simpleFOC源码分为如下5个部分,其中communication是跟simpleFOC上位机通讯&a…...
web.xml常用配置
web.xml是Java Web应用程序的部署描述文件,它位于WEB-INF目录下。web.xml文件主要用于配置Servlet、Filter、Listener、MIME类型、欢迎页面等组件,以及一些Web应用的上下文参数。以下是一些常见的web.xml配置说明: Servlet配置: …...
Awesome Rust核心库精选:异步编程与网络开发
Awesome Rust核心库精选:异步编程与网络开发 本文深入探讨了Rust生态系统中的核心库,重点分析了异步运行时(Tokio与async-std)、网络编程库、HTTP客户端/服务器框架、数据序列化工具链以及密码学与安全相关库。通过对比分析各库的…...
5步掌控Windows Defender:开源工具实现永久安全策略定制
5步掌控Windows Defender:开源工具实现永久安全策略定制 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-control …...
GLM-4.1V-9B-Base惊艳输出:支持追问式对话的图片理解连续推理演示
GLM-4.1V-9B-Base惊艳输出:支持追问式对话的图片理解连续推理演示 1. 视觉多模态模型新标杆 GLM-4.1V-9B-Base是智谱最新开源的视觉多模态理解模型,它重新定义了图片理解与交互的方式。不同于传统视觉模型只能做简单识别,这个9B参数的模型支…...
Qwen3-14B镜像深度解析:内置权重+FlashAttention-2+PyTorch 2.4优化
Qwen3-14B镜像深度解析:内置权重FlashAttention-2PyTorch 2.4优化 1. 镜像概述与核心优势 Qwen3-14B私有部署镜像是专为RTX 4090D 24GB显存环境优化的开箱即用解决方案。这个镜像最大的特点是将模型权重、运行环境和优化组件全部预装完成,用户无需处理…...
低功耗psram在嵌入式存储领域的作用
在嵌入式存储领域,低功耗PSRAM(伪静态随机存取存储器)正逐渐成为智能穿戴、物联网设备等对功耗和体积敏感应用的理想选择。那么,PSRAM究竟有什么作用?为什么它能在低功耗场景中脱颖而出? 1.psram是什么 PS…...
3大核心能力解锁古汉语NLP:甲言工具包全解析
3大核心能力解锁古汉语NLP:甲言工具包全解析 【免费下载链接】Jiayan 甲言,专注于古代汉语(古汉语/古文/文言文/文言)处理的NLP工具包,支持文言词库构建、分词、词性标注、断句和标点。Jiayan, the 1st NLP toolkit designed for Classical C…...
OpenClaw安全实验室:SecGPT-14B+Metasploit自动化漏洞验证环境
OpenClaw安全实验室:SecGPT-14BMetasploit自动化漏洞验证环境 1. 为什么需要自动化漏洞验证环境 作为安全研究员,我每天要处理大量漏洞扫描报告。最头疼的不是发现漏洞,而是验证这些漏洞的真实性——手动复现每个漏洞需要反复切换工具、整理…...
3分钟搞定Axure中文界面:终极汉化指南让原型设计更简单
3分钟搞定Axure中文界面:终极汉化指南让原型设计更简单 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure …...
Qwen3-14B二次开发入门:基于内置Transformers接口扩展自定义功能
Qwen3-14B二次开发入门:基于内置Transformers接口扩展自定义功能 1. 为什么需要二次开发Qwen3-14B Qwen3-14B作为通义千问系列的最新大语言模型,在通用任务上表现出色。但在实际业务场景中,我们往往需要针对特定需求进行功能扩展。比如&…...
Figo人机交互中“疯态”边界的引导与驯化————“可控赛博疯态”动态机制与实现路径研究
人机交互中“疯态”边界的引导与驯化 ——“可控赛博疯态”动态机制与实现路径研究 作者:Figo Cheung & Figo AI team 摘要:随着生成式人工智能技术的迭代升级,人机交互中涌现出一种突破常规逻辑、具有高度创造性与情感张力的“赛…...
