Sping源码(九)—— Bean的初始化(非懒加载)— EmbeddedValueResolver

序言

上一篇文章介绍了ConversionService,顺着finishBeanFactoryInitialization主流程继续往下走,这篇文章介绍EmbeddedValueResolver

源码

源码中关于EmbeddedValueResolver有说到,如果没有BeanPostProcessor则创建一个默认的内嵌的值解析器。那我们来看看在这之前是否在beanFacroty中设置过该值。

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// Initialize conversion service for this context.// 如果包含ConversionService,则赋值给conversionService变量if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));}// Register a default embedded value resolver if no bean post-processor// (such as a PropertyPlaceholderConfigurer bean) registered any before:// at this point, primarily for resolution in annotation attribute values.// 如果beanFactory之前没有注册嵌入值解析器,则注册默认的嵌入值解析器,主要用于注解属性值的解析if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));}// Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.// 获取实现了LoadTimeWeaverAware的监听器,并初始化String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.// 将临时类加载器设置为nullbeanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes.// 将beanFactory冻结,因为即将要实例化Bean所以冻结BeanDefinition,不允许再添加beanDefinitionbeanFactory.freezeConfiguration();// Instantiate all remaining (non-lazy-init) singletons.// 实例化所有剩余的单例beanbeanFactory.preInstantiateSingletons();}

何时添加EmbeddedValueResolver

通过对embeddedValueResolvers属性添加操作调用往回推,可以看到这样的继承关系 PropertySourcesPlaceholderConfigurer
——》 PlaceholderConfigurerSupport——》 PropertyResourceConfigurer——》BeanFactoryPostProcessor

	@Overridepublic void addEmbeddedValueResolver(StringValueResolver valueResolver) {this.embeddedValueResolvers.add(valueResolver);}@Overridepublic boolean hasEmbeddedValueResolver() {return !this.embeddedValueResolvers.isEmpty();}

而我们之前介绍BeanFactoryPostProcessor时有提到过,如果类实现了BeanFactoryPostProcessor则一定会有postProcessBeanFactory()方法。

所以我们直接看 PropertySourcesPlaceholderConfigurer下的postProcessBeanFactory()

@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {// 省略部分代码。。。。processProperties(beanFactory, new PropertySourcesPropertyResolver(this.propertySources));this.appliedPropertySources = this.propertySources;}
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess,final ConfigurablePropertyResolver propertyResolver) throws BeansException {//省略部分代码doProcessProperties(beanFactoryToProcess, valueResolver);}

最终在doProcessProperties()中做了addEmbeddedValueResolver()的操作。

protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess,StringValueResolver valueResolver) {//省略部分代码// New in Spring 3.0: resolve placeholders in embedded values such as annotation attributes.beanFactoryToProcess.addEmbeddedValueResolver(valueResolver);}

处理完EmbeddedValueResolver后,BeanFacroty依然做了一些准备工作,包括将临时类加载器置空等。其中值得关注的是beanFactory.freezeConfiguration();
方法中设置了configurationFrozen 标志为 true ,并将当前BeanFacroty中的 beanDefinitionNames 赋值给 frozenBeanDefinitionNames ,当我初始化Bean时,我的Bean一定是不会变化的,所以要进行冻结操作。

@Overridepublic void freezeConfiguration() {this.configurationFrozen = true;this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17697.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】d1

关键字&#xff1a; 运行、前缀、输入输出、换行 运行f10 前缀必须项&#xff1a; #include <iostream> using namespace std; 输入/输出&#xff1a; cin >> 输入 cout << 输出 语句通过>>或<<分开 换行 endl或者"\n"

了解CSS中的link和@import引入CSS的区别

CSS中的link和import引入CSS的主要区别如下: 1&#xff1a;引入方式: link是HTML标签,用于在HTML文档中引入外部资源,如CSS文件。import是CSS语法,用于在CSS文件中引入其他CSS文件。2&#xff1a;加载顺序: link引入的CSS文件会与HTML文档并行加载,不会阻塞HTML文档的解析。im…

VMware报平台不支持虚拟化Win10家庭版关闭Hyper-V及内核隔离

1.BIOS中开启虚拟化功能 2.启动或关闭程序中找不到Hyper-v 停止 hypervisorlaunchtype&#xff08;Windows Hyper-V 启动加载器&#xff09; 以管理员的身份打开命令行窗口&#xff0c;运行如下命令&#xff0c;关闭停止 Windows Hyper-V 启动加载器 开启 Windows Hyper-V 启…

防火墙基础技术篇:ensp配置防火墙ssh方式登录

防火墙基础技术篇&#xff1a;ensp配置防火墙ssh方式登录 一、SSH 是什么 历史上&#xff0c;网络主机之间的通信是不加密的&#xff0c;属于明文通信。这使得通信很不安全&#xff0c;一个典型的例子就是服务器登录。登录远程服务器的时候&#xff0c;需要将用户输入的密码传…

TECHNIUM INTERNATIONAL: 利用 AI 和 TECHNIUM 矩阵协议引领区块链创新

在充满活力的加密货币和区块链技术领域&#xff0c;Technium International 以领军者的姿态迅速崛起&#xff0c;跻身科技巨头的顶尖行列。Technium International 成立于 2018 年&#xff0c;总部设于塞席尔&#xff0c;透过人工智慧&#xff08;AI&#xff09;和区块链技术的…

智能跳绳的产品体验与思考(一)

我&#xff0c;虽称不上跳绳高手&#xff0c;却对这项运动怀有深厚的热爱&#xff0c;也曾在某电商平台上选购过一款智能跳绳&#xff0c;希望能借此提升我的跳绳技巧。今天&#xff0c;咱们就来聊聊我和这条绳子的发生的一些故事&#xff0c;外加我的一些思考。 此刻&#xf…

揭秘python模块导入的“隐身术”:如何控制模块代码的执行?

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;两个下划线的奥秘 二、案例展示&#xff1a;模块导入与代码执行 1. 导…

win11中文文件名称乱码解决方案

解压后出现以下的乱码 解决方案 步骤1.winR 输入intl.cpl 或 windows 自带的搜索搜“intl.cpl”&#xff0c;打开这个面板控制项 步骤2.在新打开的区域面板中&#xff0c;选择“管理”标签页&#xff0c;点击下方的“更改系统区域设置”按钮 步骤3.取消"Beta版…"选…

4步成功将三方库——speexdsp移植到OpenHarmony

四步实现三方库移植&#xff1a; 1、在Linux下编译要移植的三仓库&#xff0c;分析编译过程&#xff1b; 2、将要移植的三方库加入编译框架中以及产品引用&#xff1b; 3、增量编译出动态链接库和可执行文件推送到开发板上&#xff1b; 4、在开发板上验证移植是否成功、API接口…

greendao实现增删改查

说明&#xff1a;最近碰到一个需求&#xff0c;在安卓上使用greendao框架&#xff0c;实现增删改查数据 效果图&#xff1a; step1: // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript {repositories {go…

Kubernetes——监听机制与调度约束

目录 前言 一、监听机制 1.Pod启动创建过程 2.调度过程 1.指定调度节点 1.1强制匹配 1.2强制约束 二、硬策略和软策略 1.键值运算关系 1.硬策略——requiredDuringSchedulingIgnoredDuringExecution 2.软策略——preferredDuringSchedulingIgnoredDuringExecution …

QTreeWidget 详解

QTreeWidget 详解 QTreeWidget 是 PyQt5 框架中的一个重要部件&#xff0c;它提供了树形结构的视图&#xff0c;可以用于显示层级数据。以下是 QTreeWidget 的详细讲解&#xff0c;包括基本用法、主要方法和属性以及如何与其他组件进行交互。 基本用法 导入模块 要使用 QTree…

UE4编辑器End键Actor贴近地面

void UXXXEditorFunctionLibrary::SnapToFloor(AActor* Actor) { if (Actor) { Actor->Modify(); GEditor->SnapObjectTo(FActorOrComponent(Actor), false, false, false, false); Actor->InvalidateLightingCache(); Actor->UpdateComponentTransforms(); } }

SAP_MM_物料主数据

在SAP的物料管理模块&#xff08;MM&#xff0c;Materials Management&#xff09;中&#xff0c;主数据&#xff08;Master Data&#xff09;是系统中管理物料相关信息的核心。主数据在整个物料管理的生命周期中起到了至关重要的作用&#xff0c;从采购到库存管理&#xff0c;…

基于单片机的自行车里程监测系统的设计

摘 要 &#xff1a;本设计是一种基于单片机的自行车里程监测系统&#xff0c;采用 STC89C52RC 单片机为核心处理芯片&#xff0c;液晶显示器使用 LCD1602 &#xff0c; 速度测量使用霍尔传感器&#xff0c;温度传感器使用 DS18B20 &#xff0c;时间由时钟芯片 DS1302 进行…

增强创作者能力:The Sandbox 首届 “创作者挑战” 回顾

首届 "创作者挑战" 为创作者在平台上赚取收入提供了难得机会。 我们发起 “创作者挑战” 的目的是支持创作者&#xff0c;赋予他们构建元宇宙的能力。我们提出三大行动号召&#xff1a;发布、参与和赚钱。新推出的「参与奖池」&#xff08;Engagement Pool&#xff0…

云计算-Amazon S3

亚马逊S3&#xff08;Amazon S3&#xff09; 亚马逊S3是一种云对象存储设施。我们将使用的对象将是您在个人计算机上常用的文件。亚马逊S3产品旨在可扩展到实际无限数量的对象和无限大小的对象&#xff0c;但我们在本实验室的练习中只会使用少量对象。当存储许多对象时&#xf…

OpenCV学习 基础图像操作(十四):直方图均衡化和直方图规定化

基础原理 直方图操作是基于像素统计的基础图像操作,被广泛运用于调整图像的对比度,并由此衍生出很多变种和该经的方式. 图像相直方图 直方图(Histogram)&#xff0c;又称质量分布图&#xff0c;是一种统计报告图&#xff0c;由一系列高度不等的纵向条纹或线段表示数据分布的…

【强训笔记】day24

NO.1 思路&#xff1a;递归。 代码实现&#xff1a; class Solution { public:bool IsBalanced_Solution(TreeNode* pRoot) {return dfs(pRoot)!-1;}int dfs(TreeNode* root){if(rootnullptr) return 0;int leftdfs(root->left);if(left-1) return -1;int rightdfs(root-…

Linux信号机制与docker应用

Linux任务终止信号 在linux系统中&#xff0c;为了终止任务&#xff0c;一般情况下&#xff0c;可能会涉及如下所示的几种信号&#xff1a; SIGTERM SIGTERM是终止命令kill默认的终止信号。此信号是由应用程序捕获的&#xff0c;使用SIGERM也让程序有机会再退出之前做好清理…