【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: 拓扑排序 算法中的背包问题 最长子序列问题 前缀和-解题集合 差分数组-解题...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
aardio 自动识别验证码输入
技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”,于是尝试整合图像识别与网页自动化技术,完成了这套模拟登录流程。核心思路是:截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...
