【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
方法的参数为ApplicationArguments
CommandLineRunner
中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: 拓扑排序 算法中的背包问题 最长子序列问题 前缀和-解题集合 差分数组-解题...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...

李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...