SpringBoot源码阅读(8)——系统环境创建

news2024/9/9 0:29:04

SpringBoot创建系统应用上下文是在run方法,第301行。

ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,
			DefaultBootstrapContext bootstrapContext, ApplicationArguments applicationArguments) {
		// Create and configure the environment
	ConfigurableEnvironment environment = getOrCreateEnvironment();
	configureEnvironment(environment, applicationArguments.getSourceArgs());
	ConfigurationPropertySources.attach(environment);
	listeners.environmentPrepared(bootstrapContext, environment);
	DefaultPropertiesPropertySource.moveToEnd(environment);
	Assert.state(!environment.containsProperty("spring.main.environment-prefix"),
			"Environment prefix cannot be set via properties.");
	bindToSpringApplication(environment);
	if (!this.isCustomEnvironment) {
		EnvironmentConverter environmentConverter = new EnvironmentConverter(getClassLoader());
		environment = environmentConverter.convertEnvironmentIfNecessary(environment, deduceEnvironmentClass());
	}
	ConfigurationPropertySources.attach(environment);
	return environment;
}
private ApplicationContextFactory applicationContextFactory = ApplicationContextFactory.DEFAULT;
private ConfigurableEnvironment getOrCreateEnvironment() {
	if (this.environment != null) {
		return this.environment;
	}
	ConfigurableEnvironment environment = this.applicationContextFactory.createEnvironment(this.webApplicationType);
	if (environment == null && this.applicationContextFactory != ApplicationContextFactory.DEFAULT) {
		environment = ApplicationContextFactory.DEFAULT.createEnvironment(this.webApplicationType);
	}
	return (environment != null) ? environment : new ApplicationEnvironment();
}
ApplicationContextFactory DEFAULT = new DefaultApplicationContextFactory();

最后具体的加载逻辑在

@Override
	public ConfigurableEnvironment createEnvironment(WebApplicationType webApplicationType) {
		return getFromSpringFactories(webApplicationType, ApplicationContextFactory::createEnvironment, null);
	}

仍然是一个工厂类:ApplicationContextFactory
这个工厂类有两个实现。

# Application Context Factories
org.springframework.boot.ApplicationContextFactory=\
org.springframework.boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext.Factory,\
org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext.Factory

算上默认的ApplicationEnvironment,有三个上下文环境类型,刚好对应了WebApplicationType的三个枚举值。

AnnotationConfigReactiveWebServerApplicationContext.Factory

注释:

接受带注释类作为输入的ReactiveWebServerApplicationContext,特别是@Configuration带注释类,还接受使用javax.inject注释的普通@Component类和JSR-330兼容类。允许一个接一个地注册类(将类名指定为配置位置)以及类路径扫描(将基本包指定为配置地点)。

注意:如果有多个@Configuration类,稍后的@Bean定义将覆盖先前加载的文件中定义的定义。这可以用来通过一个额外的Configuration类故意覆盖某些bean定义。

在这里插入图片描述
如果是REACTIVE类型,就创建一个ApplicationReactiveWebEnvironment类。

AnnotationConfigServletWebServerApplicationContext.Factory

注释:

ServletWebServerApplicationContext,它接受带注释的类作为输入,特别是@Configuration注释的类,也接受普通的@Component类和使用javax.inject注释的JSR-330兼容类。允许一个接一个地注册类(将类名指定为配置位置)以及类路径扫描(将基本包指定为配置地点)

注意:如果有多个@Configuration类,稍后的@Bean定义将覆盖先前加载的文件中定义的定义。这可以用来通过一个额外的Configuration类故意覆盖某些bean定义。

在这里插入图片描述
如果应用类型是SERVLET,就创建一个ApplicationServletEnvironment类。

java中实例化一个类,会同时调用父类的构造方法。
在这里插入图片描述

ApplicationServletEnvironment

继承关系:StandardServletEnvironmentStandardEnvironmentAbstractEnvironment
AbstractEnvironment抽象类中,创建了一个类。

public AbstractEnvironment() {
	this(new MutablePropertySources());
}
protected AbstractEnvironment(MutablePropertySources propertySources) {
	this.propertySources = propertySources;
	this.propertyResolver = createPropertyResolver(propertySources);
	customizePropertySources(propertySources);
}

最终,propertySources是一个MutablePropertySources 类型。
propertyResolver则是被使用子类createPropertyResolver方法返回的值。

@Override
protected ConfigurablePropertyResolver createPropertyResolver(MutablePropertySources propertySources) {
	return ConfigurationPropertySources.createPropertyResolver(propertySources);
}

创建了一个ConfigurationPropertySourcesPropertyResolver类,再创建一个DefaultResolver,持有propertySources

然后调用子类customizePropertySources方法。

public static final String SERVLET_CONTEXT_PROPERTY_SOURCE_NAME = "servletContextInitParams";
public static final String SERVLET_CONFIG_PROPERTY_SOURCE_NAME = "servletConfigInitParams";
public static final String JNDI_PROPERTY_SOURCE_NAME = "jndiProperties";
private static final boolean jndiPresent = ClassUtils.isPresent(
			"javax.naming.InitialContext", StandardServletEnvironment.class.getClassLoader());
@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
	propertySources.addLast(new StubPropertySource(SERVLET_CONFIG_PROPERTY_SOURCE_NAME));
	propertySources.addLast(new StubPropertySource(SERVLET_CONTEXT_PROPERTY_SOURCE_NAME));
	if (jndiPresent && JndiLocatorDelegate.isDefaultJndiEnvironmentAvailable()) {
		propertySources.addLast(new JndiPropertySource(JNDI_PROPERTY_SOURCE_NAME));
	}
	super.customizePropertySources(propertySources);
}

把servlet上下文参数和servlet配置参数放入propertySources,占位。
然后调用父类方法

public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";
public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";
@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
	propertySources.addLast(
			new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
	propertySources.addLast(
			new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
}

把系统环境变量和JVM环境变量添加到propertySources中。

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

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

相关文章

windows远程桌面到 Linux系统(Ubuntu:22.04)—— 安装xrdp软件

1、在Linux系统上安装xrdp软件 sudo apt update sudo apt install xrdp2、安装完成后,需要开启xrdp服务 sudo systemctl start xrdp sudo systemctl enable xrdp打印返回 Synchronizing state of xrdp.service with SysV service script with /lib/systemd/system…

【VSCode】设置背景图片

1.下载background插件:拓展程序→background→install安装→设置: 2.点击在 settings.json 中编辑: 3.将settings.json文件中所有代码注释,添加以下代码: {// 是否开启背景图显示"background.enabled": t…

【每天认识一个漏洞】sourcemap文件泄露漏洞

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 利用工具 油猴脚本sourcemap-searcher或burp hae插件 F12控制台输入sms()如果存在会有提示,然后打开看能够下载…

数字化时代的供应链管理综合解决方案

目录 引言背景与意义供应链管理综合解决方案的目标 📄供应链管理系统主要功能系统优势 📄物流管理系统主要功能系统优势 📄订单管理系统主要功能应用场景 📄仓储管理系统系统亮点主要功能系统优势 📄商城管理系统主要功…

【机器学习】独立成分分析(ICA):解锁信号的隐秘面纱

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 独立成分分析(ICA):解锁信号的隐秘面纱引言I…

LLM——langchain 与阿里 DashScop (通义千问大模型) 和 DashVector(向量数据库) 结合使用总结

文章目录 前言预览直接调用大模型使用 prompt template格式化输出使用上下文 RAG 增强检索 自定义 langchain AgentPromptTemplate 和 ChatPromptTemplate使用少量示例创建ChatPromptTemplate 前言 langchain 是一个面向大模型开发的框架,其中封装了很多核心组件&a…

旷野之间9 - 如何判断是AI编写的文章

一个人写作 人工智能创作的文章、博客、论文甚至书籍在整个互联网上越来越成为问题。 许多人都不确定如何辨别一件作品是由人工智能还是人类创作的。在这篇文章中,我将向您展示如何区分人类和机器人。 深度与原创性 首先要寻找的线索之一是缺乏深度或原创性。人工…

【以史为镜、以史明志,知史爱党、知史爱国】中华上下五千年之-五代十国

五代十国(907年-960年)是中国历史上的一段大分裂时期,也是对五代与十国的合称。 五代依次为 梁、 唐、 晋、 汉、 周五个朝代,史称 后梁、 后唐、 后晋、 后汉与 后周。 后梁- 五代第一个朝代 朱全忠(朱温)…

跨境电商必备技能:掌握亚马逊测评自养号技术

亚马逊自养号的环境搭建是一个至关重要的过程,它直接关系到账号的稳定性和安全性。以下是一个详细的搭建方案: 一、底层环境搭建 设备底层硬件参数的伪装阻断: 通过国外服务器在云端搭建一个安全终端,用于阻断平台对设备底层硬…

(CVPR-2022)利用潜在扩散模型进行高分辨率图像合成

利用潜在扩散模型进行高分辨率图像合成 Title:High-Resolution Image Synthesis with Latent Diffusion Models paper是慕尼黑大学和海德堡大学发表在CVPR 22的工作 paper地址 文章目录 利用潜在扩散模型进行高分辨率图像合成Abstract1. Introduction2. Related Work3. Method3…

开关电源——15种控制模式(1)

关于开关电源的控制模式,TI官网的控制模式快速参考指南有相对全面的归纳和描述,提供了15种不同的控制架构,这些架构涵盖了从基础到高级的多种控制模式,以适应不同的应用需求,如下表所示: 以下是对控制模式相…

css实现3d照片墙

效果图 vue2写法&#xff1a; <template><div class"container"><div class"box"><div class"circle circle1"><img src"../../../assets/images/main/logo.png" alt"" /></div>&l…

OpenCV和PIL进行前景提取

摘要 在图像处理和分析中&#xff0c;前景提取是一项关键技术&#xff0c;尤其是在计算机视觉和模式识别领域。本文介绍了一种结合OpenCV和PIL库的方法&#xff0c;实现在批量处理图像时有效提取前景并保留原始图像的EXIF数据。具体步骤包括从指定文件夹中读取图像&#xff0c…

智慧水利的变革之路:如何通过大数据、物联网和人工智能构建高效、智能、可持续的水利管理新模式

目录 一、引言&#xff1a;智慧水利的时代背景与意义 二、大数据&#xff1a;水利管理的数据基石 &#xff08;一&#xff09;数据收集与整合 &#xff08;二&#xff09;数据分析与挖掘 三、物联网&#xff1a;水利管理的感知神经 &#xff08;一&#xff09;智能感知与监…

现在国内的ddos攻击趋势怎么样?想了解现在ddos的情况该去哪看?

目前&#xff0c;国内的DDoS攻击趋势显示出以下几个特征&#xff1a; 攻击频次显著增加&#xff1a;根据《快快网络2024年DDoS攻击趋势白皮书》&#xff0c;2023年DDoS攻击活动有显著攀升&#xff0c;总攻击次数达到1246.61万次&#xff0c;比前一年增长了18.1%。 攻击强度和规…

可视化作品集(12):智慧园区绝对是可视化大屏重点应用领域。

现在越来越多的园区上了可视化大屏&#xff0c;来对园区进行智慧化管理&#xff0c;本期分享一些精彩案例给大家。

2024年AI终端白皮书-AI与人协作、服务于人

来源&#xff1a;华为&清华大学&#xff1a; 近期历史回顾&#xff1a; 2024年上半年全国新房市场报告.pdf 2024移动应用趋势区域聚焦-土耳其.pdf 2024年轻人购房意愿调查报告.pdf 2024药械企业HCP全渠道营销实践指南.pdf 中国水产品贸易月度监测报告(2024年1-5月&#xf…

汽车免拆诊断案例 | 奥迪 Q7 e-tron无法通过插电式充电器充电

故障现象 车主反映&#xff0c;车辆无法使用自带的插电式充电器充电。&#xff08;这种充电方法是“Mode 2充电”&#xff0c;3针插头&#xff0c;10 A&#xff0c;2.2 kW&#xff09; 接车后验证故障&#xff0c;将Type 2充电插头连接到车辆时&#xff0c;充电口锁定销循环三…

从0到1写vue源码(02手写diff算法)

snabbdom snabbdom简介 搭建snabbdom环境 npm init npm i -S snabbdom搭建好后出现这样一个文件&#xff0c;sanabbdom里边就有js源码 接着安装webpack命令 npm install --save-dev webpack5 webpack-cli3 webpack-dev-server3 --legacy-peer-deps 直接npm run dev命令 接…

实战教程:如何利用Optimizer优化你的Windows系统?

前言 你是否厌倦了系统臃肿、隐私泄露的烦恼&#xff1f;小江湖今天就要带你走进一个全新的世界&#xff0c;一个能够让你重获自由与安心的神奇之地——Optimizer&#xff0c;一款专为Windows用户打造的深度优化神器&#xff1b;有了它你仅需轻轻一点&#xff0c;再也不用为系…