springboot教程(SpringBoot究竟是如何跑起来的)

2024-07-07 03:41:47 81

springboot教程(SpringBoot究竟是如何跑起来的)

本文目录

SpringBoot究竟是如何跑起来的

如果我们使用的是SpringApplication的静态run方法,那么,这个方法里面首先要创建一个SpringApplication对象实例,然后调用这个创建好的SpringApplication的实例方法。在SpringApplication实例初始化的时候,它会提前做几件事情:

根据classpath里面是否存在某个特征类(org.springframework.web.context.ConfigurableWebApplicationContext)来决定是否应该创建一个为Web应用使用的ApplicationContext类型。

使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。

使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。

推断并设置main方法的定义类。

2) SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener。调用它们的started()方法,告诉这些SpringApplicationRunListener,“嘿,SpringBoot应用要开始执行咯!”。

3) 创建并配置当前Spring Boot应用将要使用的Environment(包括配置要使用的PropertySource以及Profile)。

4) 遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法,告诉他们:“当前SpringBoot应用使用的Environment准备好了咯!”。

5) 如果SpringApplication的showBanner属性被设置为true,则打印banner。

6) 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext使用。

7) ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。

8) 遍历调用所有SpringApplicationRunListener的contextPrepared()方法。

9) 最核心的一步,将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。

10) 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。

11) 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。

12) 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。

13) 正常情况下,遍历执行SpringApplicationRunListener的finished()方法、(如果整个过程出现异常,则依然调用所有SpringApplicationRunListener的finished()方法,只不过这种情况下会将异常信息一并传入处理)

SpringBoot是如何动起来的

程序入口

SpringApplication.run(BeautyApplication.class, args);

执行此方法来加载整个SpringBoot的环境。

1. 从哪儿开始?

SpringApplication.java

/**

* Run the Spring application, creating and refreshing a new

* {@link ApplicationContext}.

* @param args the application arguments (usually passed from a Java main method)

* @return a running {@link ApplicationContext}

*/

public ConfigurableApplicationContext run(String... args) {

//...

}

调用SpringApplication.java 中的 run 方法,目的是加载Spring Application,同时返回 ApplicationContext。

2. 执行了什么?

2.1 计时

记录整个Spring Application的加载时间!

StopWatch stopWatch = new StopWatch();

stopWatch.start();

// ...

stopWatch.stop();

if (this.logStartupInfo) {

new StartupInfoLogger(this.mainApplicationClass)

.logStarted(getApplicationLog(), stopWatch);

}

2.2 声明

指定 java.awt.headless,默认是true 一般是在程序开始激活headless模式,告诉程序,现在你要工作在Headless mode下,就不要指望硬件帮忙了,你得自力更生,依靠系统的计算能力模拟出这些特性来。

private void configureHeadlessProperty() {

System.setProperty(SYSTEM_PROPERTY_JAVA_AWT_HEADLESS, System.getProperty(

SYSTEM_PROPERTY_JAVA_AWT_HEADLESS, Boolean.toString(this.headless)));

}

2.4 配置监听并发布应用启动事件

SpringApplicationRunListener 负责加载 ApplicationListener事件。

SpringApplicationRunListeners listeners = getRunListeners(args);

// 开始

listeners.starting();

// 处理所有 property sources 配置和 profiles 配置,准备环境,分为标准 Servlet 环境和标准环境

ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);

// 准备应用上下文

prepareContext(context, environment, listeners, applicationArguments,printedBanner);

// 完成

listeners.started(context);

// 异常

handleRunFailure(context, ex, exceptionReporters, listeners);

// 执行

listeners.running(context);

getRunListeners 中根据 type = SpringApplicationRunListener.class 去拿到了所有的 Listener 并根据优先级排序。

对应的就是 META-INF/spring.factories 文件中的 org.springframework.boot.SpringApplicationRunListener=org.springframework.boot.context.event.EventPublishingRunListener

private 《T》 Collection《T》 getSpringFactoriesInstances(Class《T》 type,

Class《?》 parameterTypes, Object... args) {

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

// Use names and ensure unique to protect against duplicates

Set《String》 names = new LinkedHashSet《》(

SpringFactoriesLoader.loadFactoryNames(type, classLoader));

List《T》 instances = createSpringFactoriesInstances(type, parameterTypes,

classLoader, args, names);

AnnotationAwareOrderComparator.sort(instances);

return instances;

}

复制代码

在 ApplicationListener 中 , 可以针对任何一个阶段插入处理代码。

public interface SpringApplicationRunListener {

/**

* Called immediately when the run method has first started. Can be used for very

* early initialization.

*/

void starting();

/**

* Called once the environment has been prepared, but before the

* {@link ApplicationContext} has been created.

* @param environment the environment

*/

void environmentPrepared(ConfigurableEnvironment environment);

/**

* Called once the {@link ApplicationContext} has been created and prepared, but

* before sources have been loaded.

* @param context the application context

*/

void contextPrepared(ConfigurableApplicationContext context);

/**

* Called once the application context has been loaded but before it has been

* refreshed.

* @param context the application context

*/

void contextLoaded(ConfigurableApplicationContext context);

/**

* The context has been refreshed and the application has started but

* {@link CommandLineRunner CommandLineRunners} and {@link ApplicationRunner

* ApplicationRunners} have not been called.

* @param context the application context.

* @since 2.0.0

*/

void started(ConfigurableApplicationContext context);

/**

* Called immediately before the run method finishes, when the application context has

* been refreshed and all {@link CommandLineRunner CommandLineRunners} and

* {@link ApplicationRunner ApplicationRunners} have been called.

* @param context the application context.

* @since 2.0.0

*/

void running(ConfigurableApplicationContext context);

/**

* Called when a failure occurs when running the application.

* @param context the application context or {@code null} if a failure occurred before

* the context was created

* @param exception the failure

* @since 2.0.0

*/

void failed(ConfigurableApplicationContext context, Throwable exception);

}

3. 每个阶段执行的内容

3.1 listeners.starting();

在加载Spring Application之前执行,所有资源和环境未被加载。

3.2 prepareEnvironment(listeners, applicationArguments);

创建 ConfigurableEnvironment; 将配置的环境绑定到Spring Application中;

private ConfigurableEnvironment prepareEnvironment(

SpringApplicationRunListeners listeners,

ApplicationArguments applicationArguments) {

// Create and configure the environment

ConfigurableEnvironment environment = getOrCreateEnvironment();

configureEnvironment(environment, applicationArguments.getSourceArgs());

listeners.environmentPrepared(environment);

bindToSpringApplication(environment);

if (this.webApplicationType == WebApplicationType.NONE) {

environment = new EnvironmentConverter(getClassLoader())

.convertToStandardEnvironmentIfNecessary(environment);

}

ConfigurationPropertySources.attach(environment);

return environment;

}

3.3 prepareContext

配置忽略的Bean;

private void configureIgnoreBeanInfo(ConfigurableEnvironment environment) {

if (System.getProperty(

CachedIntrospectionResults.IGNORE_BEANINFO_PROPERTY_NAME) == null) {

Boolean ignore = environment.getProperty("spring.beaninfo.ignore",

Boolean.class, Boolean.TRUE);

System.setProperty(CachedIntrospectionResults.IGNORE_BEANINFO_PROPERTY_NAME,

ignore.toString());

}

}

打印日志-加载的资源

Banner printedBanner = printBanner(environment);

根据不同的WebApplicationType创建Context

context = createApplicationContext();

3.4 refreshContext

支持定制刷新

/**

* Register a shutdown hook with the JVM runtime, closing this context

* on JVM shutdown unless it has already been closed at that time.

* 《p》This method can be called multiple times. Only one shutdown hook

* (at max) will be registered for each context instance.

* @see java.lang.Runtime#addShutdownHook

* @see #close()

*/

void registerShutdownHook();

3.5 afterRefresh

刷新后的实现方法暂未实现

/**

* Called after the context has been refreshed.

* @param context the application context

* @param args the application arguments

*/

protected void afterRefresh(ConfigurableApplicationContext context,

ApplicationArguments args) {

}

3.6 listeners.started(context);

到此为止, Spring Application的环境和资源都加载完毕了; 发布应用上下文启动完成事件; 执行所有 Runner 运行器 - 执行所有 ApplicationRunner 和 CommandLineRunner 这两种运行器

// 启动

callRunners(context, applicationArguments);

3.7 listeners.running(context);

触发所有 SpringApplicationRunListener 监听器的 running 事件方法

希望对你有帮助

如何创建Spring Boot应用需要注意什么

创建 Spring Boot 应用其实很简单,添加基础依赖包,有以下两种方式

1. 继承spring-boot-starter-parent项目

《parent》

《groupId》

org.springframework.boot

《/groupId》

《artifactId》

spring-boot-starter-parent

《/artifactId》

《version》

1.5.6.RELEASE

《/version》

《/parent》

2. 导入spring-boot-dependencies项目依赖

《dependencyManagement》

《dependencies》

《dependency》

《groupId》

org.springframework.boot

《/groupId》

《artifactId》

spring-boot-dependencies

《/artifactId》

《version》

1.5.6.RELEASE

《/version》

《type》

pom

《/type》

《scope》

import

《/scope》

《/dependency》

《/dependencyManagement》

或者去 https://start.spring.io/ 快速生成,祝你好运????

springboot教程(SpringBoot究竟是如何跑起来的)

本文编辑:admin
springboot教程 ,prin

更多文章:


腾讯qq游戏大厅网页版(qq游戏大厅网页版 三国塔防小游戏)

腾讯qq游戏大厅网页版(qq游戏大厅网页版 三国塔防小游戏)

各位老铁们好,相信很多人对腾讯qq游戏大厅网页版都不是特别的了解,因此呢,今天就来为大家分享下关于腾讯qq游戏大厅网页版以及qq游戏大厅网页版 三国塔防小游戏的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录qq游

2024年4月10日 05:05

99猫商城怎么样?猫做了绝育手术后,会对它的身体和寿命有影响吗

99猫商城怎么样?猫做了绝育手术后,会对它的身体和寿命有影响吗

本文目录99猫商城怎么样猫做了绝育手术后,会对它的身体和寿命有影响吗家里来了只小猫,叫阿久,久久,小久好,还是叫吉祥好猫吐白沫了,怎么办啊猫的名字可以叫长久久吗为什么有的人去世后会在他生前的地方出现久久不愿离去的蝴蝶猫真的会被打服吗哪部电视

2024年3月15日 02:20

神武龙宫怎么加点(神武3龙宫怎样加点)

神武龙宫怎么加点(神武3龙宫怎样加点)

本文目录神武3龙宫怎样加点神武龙宫咋加点 不要pk的 4魔1耐好还是4力1敏好》神武龙宫怎么加点另外装备怎么打宝石神武龙宫为什么他们魔力加点很高呢神武3手游龙宫怎么加点神武3龙宫怎么加点 神武3手游龙宫加点推荐神武龙宫职业加点攻略 如何加点

2024年7月1日 07:16

火狐浏览器安卓版手机(为什么我手机(vivo V2)安装不了火狐浏览器安卓版空间足够,安装时出现数据包已被破坏的提示)

火狐浏览器安卓版手机(为什么我手机(vivo V2)安装不了火狐浏览器安卓版空间足够,安装时出现数据包已被破坏的提示)

各位老铁们,大家好,今天由我来为大家分享火狐浏览器安卓版手机,以及为什么我手机(vivo V2)安装不了火狐浏览器安卓版空间足够,安装时出现数据包已被破坏的提示的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的

2024年5月17日 22:57

赛车游戏大全下载(疯狂赛车游戏免费下载无限金币版怎么下载)

赛车游戏大全下载(疯狂赛车游戏免费下载无限金币版怎么下载)

大家好,如果您还对赛车游戏大全下载不太了解,没有关系,今天就由本站为大家分享赛车游戏大全下载的知识,包括疯狂赛车游戏免费下载无限金币版怎么下载的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录疯狂赛车游戏免费下载无限

2024年6月23日 10:55

斗破苍穹漫画免费(2022斗破苍穹漫画哪里更新的最快呢)

斗破苍穹漫画免费(2022斗破苍穹漫画哪里更新的最快呢)

本篇文章给大家谈谈斗破苍穹漫画免费,以及2022斗破苍穹漫画哪里更新的最快呢对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录2022斗破苍穹漫画哪里更新的最快呢斗破苍穹免费漫画在哪儿下载斗破苍穹漫画在哪看斗破苍穹漫画可以免费下

2024年4月18日 23:00

韩语输入法安卓版(小米手机怎么输入韩文)

韩语输入法安卓版(小米手机怎么输入韩文)

各位老铁们,大家好,今天由我来为大家分享韩语输入法安卓版,以及小米手机怎么输入韩文的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录小米手机怎么输入韩

2024年8月14日 05:01

头条新闻最新消息(头条最新文章在哪里看)

头条新闻最新消息(头条最新文章在哪里看)

今天给各位分享头条最新文章在哪里看的知识,其中也会对头条最新文章在哪里看进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录头条最新文章在哪里看新闻头条是什么好看视频头条新闻在哪新闻头条最新消息什么时间变彩色重磅头

2024年6月27日 05:18

孤岛惊魂1作弊器(孤岛惊魂1修改器无法使用)

孤岛惊魂1作弊器(孤岛惊魂1修改器无法使用)

本文目录孤岛惊魂1修改器无法使用孤岛惊魂修改器怎么用孤岛惊魂1作弊码孤岛惊魂1 修改器《孤岛惊魂1》的修改器有哪些孤岛惊魂1控制台作弊码,我输入了作弊码,没有作用,谁告诉告诉孤岛惊魂如何无限弹药求孤岛惊魂作弊码孤岛惊魂1秘籍究竟怎么用试了好

2024年6月24日 07:44

免费屏幕录制软件(电脑屏幕录屏软件)

免费屏幕录制软件(电脑屏幕录屏软件)

大家好,免费屏幕录制软件相信很多的网友都不是很明白,包括电脑屏幕录屏软件也是一样,不过没有关系,接下来就来为大家分享关于免费屏幕录制软件和电脑屏幕录屏软件的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目录电脑屏幕录

2024年4月2日 14:35

我是刚加入滴滴快车司机端该如何接单及规则?滴滴打车司机端是怎么注册的

我是刚加入滴滴快车司机端该如何接单及规则?滴滴打车司机端是怎么注册的

本篇文章给大家谈谈滴滴司机端,以及我是刚加入滴滴快车司机端该如何接单及规则对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录我是刚加入滴滴快车司机端该如何接单及规则滴滴打车司机端是怎么注册的滴滴司机端怎么设置高德地图滴滴快车司机

2024年5月28日 01:04

介绍下,什么视频加速器比较好用?电视网络盒子上用视频加速器真的有用吗

介绍下,什么视频加速器比较好用?电视网络盒子上用视频加速器真的有用吗

本篇文章给大家谈谈视频加速器,以及介绍下,什么视频加速器比较好用对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录介绍下,什么视频加速器比较好

2024年6月26日 04:10

联众保皇游戏大厅(联众世界老版保皇在哪里shuafen)

联众保皇游戏大厅(联众世界老版保皇在哪里shuafen)

大家好,关于联众保皇游戏大厅很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于联众世界老版保皇在哪里shuafen的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2024年6月5日 04:43

windows defender无法启动(windows defender无法启动服务怎么办)

windows defender无法启动(windows defender无法启动服务怎么办)

本文目录windows defender无法启动服务怎么办windows 无法启动 windows defender 服务(位于 本地计算机上 ) 错误0x80070426:服务尚未启动电脑操作中心无法启用Windows defender怎

2024年5月1日 22:27

金山杀毒手机版下载(安卓手机中病毒了!怎么杀毒)

金山杀毒手机版下载(安卓手机中病毒了!怎么杀毒)

大家好,如果您还对金山杀毒手机版下载不太了解,没有关系,今天就由本站为大家分享金山杀毒手机版下载的知识,包括安卓手机中病毒了!怎么杀毒的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录安卓手机中病毒了!怎么杀毒杀手机

2024年6月25日 15:19

拉面熊阵容装备(云顶之弈:神超推荐各流派主C英雄装备,龙女必备狂徒,拉面熊必备红Buff,你认同吗)

拉面熊阵容装备(云顶之弈:神超推荐各流派主C英雄装备,龙女必备狂徒,拉面熊必备红Buff,你认同吗)

本文目录云顶之弈:神超推荐各流派主C英雄装备,龙女必备狂徒,拉面熊必备红Buff,你认同吗云顶之弈中最恶心的阵容是什么,六盾法,拉面熊还是四枪手六极地lol云顶之弈哪套阵容最强LOL官宣云顶之弈8大流派,“拉面熊”没牌面,鸟盾法仍是版本王,

2024年5月19日 08:04

三国志系列最好玩的一款(三国志哪一代最好玩呢)

三国志系列最好玩的一款(三国志哪一代最好玩呢)

本篇文章给大家谈谈三国志系列最好玩的一款,以及三国志哪一代最好玩呢对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录三国志哪一代最好玩呢最好玩

2024年4月21日 12:05

pokemon go 官网(pokemon go官网怎么捉)

pokemon go 官网(pokemon go官网怎么捉)

本文目录pokemon go官网怎么捉《精灵宝可梦go》官网账号怎么注册如何在pokemon go 上创建账号如何申请pokemongo账号pokemon go官网怎么捉就点击圆圈范围内的Pokemon然后就会有类似于战斗场面的,扔poke

2024年5月7日 18:06

如何下载手机qq2013(手机上怎么下载QQ(详细步骤))

如何下载手机qq2013(手机上怎么下载QQ(详细步骤))

本文目录手机上怎么下载QQ(详细步骤)用手机是如何下载手机QQ的详细方法及步骤怎么下载旧版手机qq2013怎样从电脑上下载手机qq到手机上如何安装手机qq怎样下载手机QQ手机上怎么下载QQ(详细步骤)一、如何从手机下载 ? 没有适合我手机下

2024年5月6日 03:14

十大不收费看盘软件排名(炒股软件排名前十)

十大不收费看盘软件排名(炒股软件排名前十)

各位老铁们,大家好,今天由我来为大家分享十大不收费看盘软件排名,以及炒股软件排名前十的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录炒股软件排名前十

2024年10月6日 01:15

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2342
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1736
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1168
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1164
标签列表

热门搜索