【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: 拓扑排序 算法中的背包问题 最长子序列问题 前缀和-解题集合 差分数组-解题...
ArcGIS Pro 3D建模简明教程
在本文中,我讲述了我最近一直在探索的在 ArcGIS Pro 中设计 3D 模型的过程。 我的目标是尽可能避免与其他软件交互(即使是专门用于 3D 建模的软件),并利用 Pro 可以提供的可能性。 这个短暂的旅程分为三个不同的阶段:…...
24届数字IC设计/验证秋招总结贴——先看这个
文章目录 前言一、经验篇二、知识学习篇三、笔试篇3.1 各大公司笔试真题3.2 华为机试——数字芯片笔试题汇总 四、面试篇4.1 时间节点4.2 提前批4.3 正式批 前言 为方便快速进行查找该专栏的内容,将所有内容链接均放在此篇博客中 整理不易,欢迎订阅~~ …...
带洞平面三角分割结果的逆向算法
先标不重复点,按最近逐个插入。 只说原理。 不带洞的 1 2 4 2 3 4 两个三角形 结果 1 2 3 4 无重复 无洞 1 2 6 1 2 3 6 1 2 3 7 6 1 2 3 4 7 6 1 2 3 4 5 7 6 1 2 3 4 1 5 7 6 1 2 3 4 1 6 5 7 6 最终结果 1 2 3 4 1 6 5 7 6 按重复分割 1 2 3…...
MGRE-OSPF接口网络类型实验
OSPF接口网络类型实验 一,实验拓扑 初始拓扑: 最终拓扑: 二,实验要求及分析 要求: 1,R6为ISP只能配置IP地址,R1-R5的环回为私有网段 2,R1/R4/R5为全连的MGRE结构,R…...
ChatGPT科研利器详解:写作论文轻松如玩游戏
ChatGPT无限次数:点击直达 ChatGPT科研利器详解:写作论文轻松如玩游戏 引言 在当今科技日新月异的时代,人工智能技术的应用越来越广泛,其中自然语言处理领域的发展尤为迅猛。ChatGPT作为一款先进的文本生成模型,为科研工作者提供…...
vue3从精通到入门23:定义全局变量
在vue2中,我们知道vue2.x是使用Vue.prototype.$xxxxxxx来定义全局变量, 比如定义一个全局的工具函数。 // 定义 ... Vue.prototype.$utilsutils;// 使用 this.$utils() ... 在vue3中我们无法使用this,提供了globalProperties; …...
反爬虫之代理IP封禁-协采云IP池
反爬虫之代理IP封禁-协采云IP池 1、目标网址2、IP封禁4033、协采云IP池 1、目标网址 aHR0cDovL3d3dy5jY2dwLXRpYW5qaW4uZ292LmNuLw 2、IP封禁403 这个网站对IP的要求很高,短时间请求十几次就会遭关进小黑屋。如下图: 明显是网站进行了反爬处理&…...
ELK-Kibana 部署
目录 一、在 node1 节点上操作 1.1.安装 Kibana 1.2.设置 Kibana 的主配置文件 1.3.启动 Kibana 服务 1.4.验证 Kibana 1.5.将 Apache 服务器的日志(访问的、错误的)添加到 ES 并通过 Kibana 显示 1.6. 浏览器访问 二、部署FilebeatELK&…...
Backtrader 量化回测实践(7)——在jupyter中执行bt的samples
Backtrader 量化回测实践(7)——在jupyter中执行bt的samples Backtrader提供了大量的测试用例,在samples目录下,测试程序主要都是用argparse解析参数,但是不能在jupyter中直接执行。 找到一个解决方法,可…...
npm vs. pnpm vs. Yarn: 三者之间的区别与比较
在现代前端开发中,包管理工具是必不可少的一环。npm、pnpm和Yarn是三个常用的包管理工具,它们各有特点,适用于不同的场景。本文将深入讨论这三者的基本概念、特点、优势和劣势,并对比分析它们之间的主要区别,包括功能、…...
yy简历网/黄山seo推广
1.下载谷歌浏览器 2.在谷歌浏览器内打开百度 3.打开百度的开发者工具:ctrlshiftI 4. 5.关注内容解释: headers: general内:http 协议请求url:https://www.baidu.com/请求方式:get响应状态码:request header…...
做海报的参考网站/搜索关键词优化排名
以前老用表格布局,总是要写很多代码,现在改成用DIV了,但是现在有很多地方还是需要表格布起来方便 ,但是要写的代码要太多,就从网上找了这个一段代码,省了不好在页面中的代码 dudley:expression(cellPadding…...
今日头条今天的最新新闻/游戏优化大师官方下载
k短路求解: k短路 单源点最短路跑反向边 高级搜索A* A*算法 结合了启发式方法和形式化方法; 启发式方法通过充分利用图给出的信息来动态地做出决定而使搜索次数大大降低; 形式化方法不利用图给出的信息,而仅通过数学的形式分析; 算法思路: 算法通过一…...
网站建设淘宝客/seo优化网站排名
随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)、QQ技术交流群(183198395)。 大家经常遇到运行java程序内存不足 修改内存不足的方法如下: Eclipse报错:gc overhead limit exceeded ec…...
用服务器做网站需要购买域名吗/乐天seo培训
根据一位群里的大神提供的思路,在Hi8pro的主板上有一个预留的3G网卡的位置,通过查询引脚定义可以找到D,D-两个USB数据引脚,然后使用万用表测量找到5V供电引脚即可。 如下图,这是USB四个引脚的接线点,焊点比…...
建设企业人力资源网站/关键词采集网站
{2015-04-24}接口更新了,暂时用不了了。 再次更新:【2015-4-24 22:13:11】接口链接更新。正常。 function getWeather($city){include weather_code.php;$code$weather_code[$city];//$url"http://tq.360.cn/api/weatherquery/querys?apptq360&am…...