【Spring Boot 源码学习】SpringApplication 的 run 方法核心流程介绍
《Spring Boot 源码学习系列》

SpringApplication 的 run 方法核心流程介绍
- 一、引言
- 二、往期内容
- 三、主要内容
- 3.1 run 方法源码初识
- 3.2 引导上下文 BootstrapContext
- 3.3 系统属性【java.awt.headless】
- 3.4 早期启动阶段
- 3.5 准备和配置应用环境
- 3.6 打印 Banner 信息
- 3.7 新建应用上下文
- 3.8 准备和配置应用上下文
- 3.9 刷新应用上下文
- 3.10 afterRefresh 方法
- 3.11 打印启动日志
- 3.12 Spring 容器启动完成
- 3.13 callRunners 方法
- 3.14 Spring 容器正在运行中
- 3.15 异常处理
- 四、总结
一、引言
在前面的博文《初识 SpringApplication》中,Huazie 带大家一起分析了 SpringApplication 类实例化的逻辑。当 SpringApplication 对象被创建之后,我们就可以调用它的 run 方法来启动和运行 Spring Boot 项目。
本篇博文将围绕 SpringApplication 的 run 方法展开,带大家一起从源码分析 Spring Boot 的运行流程。

二、往期内容
在开始本篇的内容介绍之前,我们先来看看往期的系列文章【有需要的朋友,欢迎关注系列专栏】:
| Spring Boot 源码学习 |
| Spring Boot 项目介绍 |
| Spring Boot 核心运行原理介绍 |
| 【Spring Boot 源码学习】@EnableAutoConfiguration 注解 |
| 【Spring Boot 源码学习】@SpringBootApplication 注解 |
| 【Spring Boot 源码学习】走近 AutoConfigurationImportSelector |
| 【Spring Boot 源码学习】自动装配流程源码解析(上) |
| 【Spring Boot 源码学习】自动装配流程源码解析(下) |
| 【Spring Boot 源码学习】深入 FilteringSpringBootCondition |
| 【Spring Boot 源码学习】OnClassCondition 详解 |
| 【Spring Boot 源码学习】OnBeanCondition 详解 |
| 【Spring Boot 源码学习】OnWebApplicationCondition 详解 |
| 【Spring Boot 源码学习】@Conditional 条件注解 |
| 【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解 |
| 【Spring Boot 源码学习】RedisAutoConfiguration 详解 |
| 【Spring Boot 源码学习】JedisConnectionConfiguration 详解 |
| 【Spring Boot 源码学习】初识 SpringApplication |
| 【Spring Boot 源码学习】Banner 信息打印流程 |
| 【Spring Boot 源码学习】自定义 Banner 信息打印 |
| 【Spring Boot 源码学习】BootstrapRegistryInitializer 详解 |
| 【Spring Boot 源码学习】ApplicationContextInitializer 详解 |
| 【Spring Boot 源码学习】ApplicationListener 详解 |
| 【Spring Boot 源码学习】SpringApplication 的定制化介绍 |
| 【Spring Boot 源码学习】BootstrapRegistry 详解 |
| 【Spring Boot 源码学习】深入 BootstrapContext 及其默认实现 |
| 【Spring Boot 源码学习】BootstrapRegistry 初始化器实现 |
| 【Spring Boot 源码学习】BootstrapContext的实际使用场景 |
| 【Spring Boot 源码学习】深入 ApplicationContext 初始化器实现 |
| 【Spring Boot 源码学习】共享 MetadataReaderFactory 上下文初始化器 |
| 【Spring Boot 源码学习】ConditionEvaluationReport 日志记录上下文初始化器 |
三、主要内容
注意: 以下涉及 Spring Boot 源码 均来自版本 2.7.9,其他版本有所出入,可自行查看源码。
3.1 run 方法源码初识

上述截图就是 SpringApplication 的 run 方法核心代码。
下面 Huazie 将带着大家一起通读这块源码,从整体上了解下 run 方法核心流程。
3.2 引导上下文 BootstrapContext
DefaultBootstrapContext bootstrapContext = createBootstrapContext();
翻看 DefaultBootstrapContext 的源码可知,从 Spring Boot 2.4.0 版本开始支持引导上下文。

在《BootstrapRegistryInitializer 详解》中,Huazie 带大家详细分析了加载并初始化 BootstrapRegistryInitializer 的逻辑。而这里的 createBootstrapContext 方法就是用于创建默认的引导上下文对象 DefaultBootstrapContext,并利用 BootstrapRegistry 初始化器初始化该引导上下文对象。
想深入了解的朋友们,可查看 Huazie 下面列出的博文:
- 《BootstrapRegistry 详解》
- 《深入 BootstrapContext 及其默认实现》
- 《BootstrapRegistry 初始化器实现》
- 《BootstrapContext的实际使用场景》
3.3 系统属性【java.awt.headless】
private static final String SYSTEM_PROPERTY_JAVA_AWT_HEADLESS = "java.awt.headless";// 配置 java.awt.headless 系统属性
private void configureHeadlessProperty() {System.setProperty(SYSTEM_PROPERTY_JAVA_AWT_HEADLESS,System.getProperty(SYSTEM_PROPERTY_JAVA_AWT_HEADLESS, Boolean.toString(this.headless)));
}
java.awt.headless 是 Java 中的一个系统属性,用于指示 Java 应用程序是否运行在 Headless 模式下。Headless 模式是指系统缺少显示设备、键盘或鼠标的状态,通常应用于服务器环境,如应用集群、数据库集群等,这些环境通常通过网络远程操作,没有实际的显示设备。
在 Java 中,AWT(Abstract Window Toolkit) 是用于构建图形用户界面(GUI)应用的标准 API 接口。
Java 为 AWT 提供了两种模式实现以适应不同的运行环境:
- 标准模式,适用于具有可用显示设备、驱动和图形用户界面的环境。
- Headless 模式 ,适用于没有显示设备、驱动或图形用户界面的环境,例如服务器。
注意: 设置
java.awt.headless属性为true会使 Java AWT 工具包在 headless 模式下运行,这意味着它将不会尝试加载或访问与图形用户界面相关的资源或功能。
3.4 早期启动阶段
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting(bootstrapContext, this.mainApplicationClass);
SpringApplicationRunListeners 中包含了一组 SpringApplicationRunListener 的集合。SpringApplicationRunListener 是 SpringApplication 的 run 方法的监听器,它用来监听 Spring Boot 应用的不同启动阶段,这些阶段都会发布对应的事件。
这里 starting 方法,就对应了最早期的启动阶段,它在 run 方法刚开始执行时就被立即调用。starting 方法里会发布 ApplicationStartingEvent 事件,通过监听该事件,应用可以执行一些非常早期的初始化工作,比如配置系统属性、初始化基础组件等等。
3.5 准备和配置应用环境
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
configureIgnoreBeanInfo(environment);
ApplicationArguments 是 Spring Boot 中用于获取命令行参数的接口,其默认实现是 DefaultApplicationArguments。
prepareEnvironment 方法用于准备和配置应用程序的运行时环境,它会发布 ApplicationEnvironmentPreparedEvent 事件,通过监听该事件,应用程序可以执行一系列操作来准备和配置其运行环境。其返回的 ConfigurableEnvironment 对象,包含了应用程序的所有配置信息。
通过 ConfigurableEnvironment 对象,我们可以获取特定配置属性的值,也可以在运行时动态修改配置属性。
我们来看看 configureIgnoreBeanInfo 方法:


在 configureIgnoreBeanInfo 方法中,可以看到如下代码:
Boolean ignore = environment.getProperty(CachedIntrospectionResults.IGNORE_BEANINFO_PROPERTY_NAME,Boolean.class, Boolean.TRUE);
从上述代码中,可以看到通过 environment 变量获取属性名为 spring.beaninfo.ignore 的属性值,其 getProperty 方法有三个参数:
- 第一个参数是属性名。
- 第二个参数是期望返回的属性值的类型,这里是
Boolean.class。 - 第三个参数是默认值,如果找不到属性或者属性不能被转换为
Boolean类型,则使用Boolean.TRUE作为默认值。
系统属性 spring.beaninfo.ignore 用于指示 Spring 在调用 JavaBeans Introspector 时使用Introspector.IGNORE_ALL_BEANINFO 模式。如果此属性的值为 true,则 Spring 会跳过搜索 BeanInfo 类(通常适用于以下情况:应用程序中的 beans 从一开始就没有定义这样的类)。
默认值是 false,表示 Spring 会考虑所有的 BeanInfo 元数据类,就像标准 Introspector.getBeanInfo(Class) 调用那样。如果在启动时或延迟加载时,反复访问不存在的 BeanInfo 类开销很大,可以考虑将此标志切换为 true。
请注意:如果存在反复访问不存在的 BeanInfo 类,可能也表明缓存未奏效。最好将 Spring 的 jar 包与应用类放在同一个 ClassLoader 中,这样可以在任何情况下与应用程序的生命周期一起进行干净的缓存。对于 Web 应用程序,如果采用多 ClassLoader 布局,可以考虑在 web.xml 中声明一个本地的 org.springframework.web.util.IntrospectorCleanupListener,这也可以实现有效的缓存。
3.6 打印 Banner 信息
Banner printedBanner = printBanner(environment);
printBanner 方法用于 Spring Boot 启动时的 Banner 信息打印。
想要深入了解 Banner 打印的读者们,请查看如下博文:
- 《Banner 信息打印流程》
- 《自定义 Banner 信息打印》
3.7 新建应用上下文
ConfigurableApplicationContext context = createApplicationContext();protected ConfigurableApplicationContext createApplicationContext() {return this.applicationContextFactory.create(this.webApplicationType);
}
上述 createApplicationContext 方法的功能是:根据给定的 Web 应用程序类型 webApplicationType 创建一个可配置的应用上下文对象 ConfigurableApplicationContext 。
在《初识 SpringApplication》这篇博文的 2.2 小节【Web 应用类型推断】中,大家可以看到 Web 应用程序类型 webApplicationType 是如何获取的,这里不赘述了,感兴趣的可以自行查看。
3.8 准备和配置应用上下文
context.setApplicationStartup(this.applicationStartup);
prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
setApplicationStartup 方法用于设置当前应用上下文的 ApplicationStartup ,这允许应用上下文在启动期间记录指标。
prepareContext 方法用于准备和配置应用程序上下文,这里会依次发布如下事件:
ApplicationContextInitializedEvent:当SpringApplication启动并且ApplicationContext已准备好,且ApplicationContextInitializer集合已被调用,但在加载任何 bean 定义之前,将发布该事件。ApplicationPreparedEvent:当SpringApplication启动并且ApplicationContext已经完全准备好但尚未刷新时,将发布事件。在此阶段,bean 定义将被加载,环境已经准备好可以使用。
3.9 刷新应用上下文
static final SpringApplicationShutdownHook shutdownHook = new SpringApplicationShutdownHook();refreshContext(context);private void refreshContext(ConfigurableApplicationContext context) {if (this.registerShutdownHook) {shutdownHook.registerApplicationContext(context);}refresh(context);
}protected void refresh(ConfigurableApplicationContext applicationContext) {applicationContext.refresh();
}
registerShutdownHook 变量表示是否应注册一个关闭钩子,默认为 true。
SpringApplicationShutdownHook 是一个用于执行 Spring Boot 应用程序优雅关闭的 Runnable 关机钩子。这个钩子跟踪已注册的应用程序上下文以及通过 SpringApplication.getShutdownHandlers() 注册的任何操作。
refreshContext 方法里面可以看到调用 refresh 方法,refresh 方法里面则是调用 ConfigurableApplicationContext【实现类是 AbstractApplicationContext ,该类属于 spring-context 包】的 refresh 方法,该方法是用来刷新底层的应用上下文。
它会加载或刷新配置的持久化表示,这可能来自基于 Java 的配置、XML 文件、属性文件、关系数据库模式或其他某种格式。调用此方法后,要么实例化所有单例对象,要么不实例化任何单例对象。
它最后会发布 ContextRefreshedEvent 事件,通过监听该事件,可以执行一些应用上下文初始化或刷新后需要进行的操作。
3.10 afterRefresh 方法
刷新应用上下文之后,调用 afterRefresh 方法。该方法的实现默认为空,可由开发人员自行扩展。

3.11 打印启动日志
long startTime = System.nanoTime();Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime);
if (this.logStartupInfo) {new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), timeTakenToStartup);
}
System.nanoTime() 用于获取当前时间的纳秒值。
Duration.ofNanos() 用于将纳秒数转换为 Duration 对象,timeTakenToStartup 表示 Spring Boot 应用启动所需的时间。
logStartupInfo 表示是否需要记录启动信息,如果为 true,则需要记录启动信息。
StartupInfoLogger 类用于在应用程序启动时记录应用信息,其中 logStarted 方法用于以 INFO 日志级别打印应用启动时间。


实际运行日志信息类似如下:

3.12 Spring 容器启动完成
listeners.started(context, timeTakenToStartup);
这里表示上下文已经刷新,应用程序已经启动,但是 CommandLineRunners 和 ApplicationRunners 尚未被调用。
SpringApplicationRunListeners 的 started 方法里会发布 ApplicationStartedEvent 事件,通知监听器 Spring 容器启动完成。
3.13 callRunners 方法
callRunners(context, applicationArguments);
callRunners 方法里面会调用 ApplicationRunner 和 CommandLineRunner 的运行方法。

通过阅读上述代码,可以总结如下:
- 首先,从
context中获取类型为ApplicationRunner和CommandLineRunner的 Bean; - 接着,将它们放入
List列表中,并进行排序。 - 最后,再遍历排序后的
ApplicationRunner和CommandLineRunner的 Bean,并调用它们的run方法。
Spring Boot 提供 ApplicationRunner 和 CommandLineRunner 这两种接口,是为了通过它们来实现在容器启动时执行一些操作。在同一个应用上下文中可以定义多个 ApplicationRunner 或 CommandLineRunner 的bean,并可以使用 Ordered 接口或 @Order 注解进行排序。
ApplicationRunner 和 CommandLineRunner 这两个接口都有一个 run 方法,但不同之处是:
ApplicationRunner中run方法的参数为ApplicationArgumentsCommandLineRunner中run方法的参数为 字符串数组
如果需要访问 ApplicationArguments 而不是原始的字符串数组,大家可以考虑使用 ApplicationRunner。
3.14 Spring 容器正在运行中
Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime);
listeners.ready(context, timeTakenToReady);
这里表示应用上下文已经刷新,所有的 CommandLineRunners 和 ApplicationRunners 都已被调用,应用程序已准备好处理请求。
SpringApplicationRunListeners 的 ready 方法里会发布 ApplicationReadyEvent 事件,通知监听器 Spring 容器正在运行中。
在 Spring Boot 2.6.0 版本之前,大家看到调用的是 SpringApplicationRunListener 的 running 方法。从 Spring Boot 2.6.0 版本开始,新增了 ready 方法替代 running 方法。在 Spring Boot 3.0.0 版本中正式去除 running 方法。

3.15 异常处理
handleRunFailure(context, ex, listeners);
从 3.5 到 3.13 小节 ,如果出现异常,则会捕获后调用 handleRunFailure 进行异常处理。
3.14 小节,同样它如果出现异常,也会捕获后调用 handleRunFailure 进行异常处理。
handleRunFailure 方法里会发布 ApplicationFailedEvent 事件,通过监听该事件,开发人员可以实现如下的一些操作:
- 错误日志记录:当应用启动失败时,可以记录详细的错误信息到日志文件中,便于后续的问题排查和分析。
- 通知发送:在应用启动失败时,可以发送通知给相关的开发或运维人员,以便他们能够及时响应并处理问题。
- 数据备份:如果应用在启动过程中出现异常,可能需要对某些关键数据进行备份,以防止数据丢失。
- 资源清理:在应用启动失败的情况下,可能需要释放或清理已经分配的资源,如数据库连接、文件句柄等。
- 尝试自动恢复:在某些情况下,可以尝试自动重启应用或者执行其他恢复操作,以减少人工干预的需求。
- 自定义处理逻辑:根据具体的业务需求,实现自定义的错误处理逻辑,比如回滚事务、关闭网络连接等。
有关这块更详细的内容,后续 Huazie 将专门出一篇讲解,敬请期待!!!
四、总结
本篇 Huazie 向大家初步介绍了 SpringApplication 的 run 方法核心流程。由于篇幅受限,其中很多环节并未深入讲解,后续 Huazie 将会针对这些内容深入分析,和大家一起从源码详细了解 Spring Boot 的运行流程。
相关文章:
【Spring Boot 源码学习】SpringApplication 的 run 方法核心流程介绍
《Spring Boot 源码学习系列》 SpringApplication 的 run 方法核心流程介绍 一、引言二、往期内容三、主要内容3.1 run 方法源码初识3.2 引导上下文 BootstrapContext3.3 系统属性【java.awt.headless】3.4 早期启动阶段3.5 准备和配置应用环境3.6 打印 Banner 信息3.7 新建应用…...
如何保证消息不丢失?——使用rabbitmq的死信队列!
如何保证消息不丢失?——使用rabbitmq的死信队列! 1、什么是死信 在 RabbitMQ 中充当主角的就是消息,在不同场景下,消息会有不同地表现。 死信就是消息在特定场景下的一种表现形式,这些场景包括: 消息被拒绝访问&am…...
html、css、京东移动端静态页面,资源免费分享,可作为参考,提供InsCode在线运行演示
CSDN将我上传的免费资源私自变成VIP专享资源,且作为作者的我不可修改为免费资源,不可删除,寻找客服无果,很愤怒,(我发布免费资源就是希望大家能免费一起用、一起学习),接下来继续寻找…...
头歌-机器学习 第13次实验 特征工程——共享单车之租赁需求预估
第1关:数据探索与可视化 任务描述 本关任务:编写python代码,完成一天中不同时间段的平均租赁数量的可视化功能。 相关知识 为了完成本关任务,你需要掌握: 读取数据数据探索与可视化 读取数据 数据保存在./step1/…...
Unity 2D让相机跟随角色移动
相机跟随移动 最简单的方式通过插件Cinemachine 在窗口/包管理器选择全部找到Cinemachine,导入。然后在游戏对象/Cinemachine创建2D Camera。此时层级中创建一个2D相机。选中人物拖入检查器Follow。此时相机跟随人物移动。 修改相机视口距离 在检查器中Lens下调正…...
【面试题】s += 1 和 s = s + 1的区别
文章目录 1.问题2.发现过程3.解析 1.问题 以下两个程序真的完全等同吗? short s 0; s 1; short s 0; s s 1; 2.发现过程 初看s 1 和 s s 1好像是等价的,没有什么区别。很长一段时间内我也是这么觉得,因为当时学习c语言的时候教科书…...
ARM的学习
点亮流水灯 .text .global _start _start: 使能GPIOE的外设时钟 RCC_MP_AHB4ENSETR 0x50000a28 [4]->1LDR R0,0X50000A28 指定基地址LDR R1,[R0] 将寄存器数据读取出来保存到R1中ORR R1,R1,#(0x3<<4) [4]设置为1ORR R1,R1,#(0x3<<5) [5]设置为1STR …...
Restful API接口规范(以Django为例)
Restful API接口规范(以Django为例) Restful API的接口架构风格中制定了一些规范,极大的简化了前后端对接的时间,以及增加了开发效率 安全性保证–使用https路径中带 api标识路径中带版本号数据即资源,通常使用名词操作请求方式决定操作资源…...
AI助力,程序员压力倍增?
讲动人的故事,写懂人的代码 你知道程序员现在在AI辅助编程时最头疼的事情是什么吗?就是怎么在改代码的时候保住小命。 大家都听过程序员因为工作太累导致过劳湿的事情。 无论是写新功能、修bug,还是更改系统配置,都得改代码。 现在有了AI的帮助,本应该轻松很多,为什么…...
LoRA微调
论文:LoRA: Low-Rank Adaptation of Large Language Models 实现:microsoft/LoRA: Code for loralib, an implementation of “LoRA: Low-Rank Adaptation of Large Language Models” (github.com) 摘要 自然语言处理的一个重要的开发范式包括&#…...
45.基于SpringBoot + Vue实现的前后端分离-驾校预约学习系统(项目 + 论文)
项目介绍 本站是一个B/S模式系统,采用SpringBoot Vue框架,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SpringBoot Vue技术的驾校预约学习系统设计与实现管理工作…...
系统思考—时间滞延
“没有足够的时间是所有管理问题的一部分。”——彼得德鲁克 鱼和熊掌可以兼得,但并不能同时获得。在提出系统解决方案时,我们必须认识到并考虑到解决方案的实施通常会有必要的时间滞延。这种延迟有时比我们预想的要长得多,特别是当方案涉及…...
SSM项目转Springboot项目
SSM项目转Springboot项目 由于几年前写的一个ssm项目想转成springboot项目,所以今天倒腾了一下。 最近有人需要毕业设计转换一下,所以我有时间的话可以有偿帮忙转换,需要的私信我或+v:Arousala_ 首先创建一个新的spr…...
VUE3.0对比VUE2.0
vue3.0 与 vue2.0的不同之处有以下几点: 数据响应式原理 3.0基于Proxy的代理实现监测,vue2.0是基于Object.defineProperty实现监测。 vue2.0 通过Object.defineProperty,每个数据属性被定义成可观察的,具有getter和setter方法&…...
车内AR互动娱乐解决方案,打造沉浸式智能座舱体验
美摄科技凭借其卓越的创新能力,为企业带来了革命性的车内AR互动娱乐解决方案。该方案凭借自研的AI检测和渲染引擎,打造出逼真的数字形象,不仅丰富了车机娱乐内容,更提升了乘客与车辆的互动体验,让每一次出行都成为一场…...
OR36 链表的回文结构
描述 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。 测试样例: 1->…...
【译】微调与人工引导: 语言模型调整中的 SFT 和 RLHF
原文地址:Fine-Tuning vs. Human Guidance: SFT and RLHF in Language Model Tuning 本文主要对监督微调(SFT, Supervised Fine Tuning )和人类反馈强化学习(RLHF, Reinforcement Learning from Human Feedback)进行简…...
kylin java.io.IOException: error=13, Permission denied
linux centos7.8 error13, Permission denied_linux open error13-CSDN博客 chmod -R 777 /home/zengwenfeng/kkFileView-4.2.1 2024-04-15 13:15:17.416 WARN 3400 --- [er-offprocmng-1] o.j.l.office.LocalOfficeProcessManager : An I/O error prevents us to determine…...
前端面试01总结
1.Js 中!x为true 时,x可能为哪些值 答: 1.false:布尔值false 2.0或-0:数字零 3.""或’或 (空字符串):长度为0的字符串 4.null:表示没有任何值的特殊值 5.undefined:变量未定义时的默认…...
算法--目录
algorithm: 十种排序算法 二分法-各种应用 algorithm: 拓扑排序 算法中的背包问题 最长子序列问题 前缀和-解题集合 差分数组-解题...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
