SpringBoot启动流程

SpringBoot启动流程

SpringBoot启动流程主要分为两大步骤:

第一步:构造一个SpringApplication的实例,完成初始化的工作。初始化的时候会做以下两件事:

(1)创建并初始化ApplicationInitializer,设置到initializers属性中 。
(2)创建并初始化ApplicationListener,设置到listeners属性中 。

第二步:SpringApplication构造完成之后调用run方法,启动SpringApplication。run方法执行的时候会做以下几件事:

(1)创建并初始化计时器StopWatch,用来记录SpringBoot的启动时间 。
(2)创建并初始化监听器SpringApplicationRunListeners,并启动监听,用于监听run方法的执行。
(3)创建并初始化ApplicationArguments,获取run方法传递的args参数。
(4)创建并初始化环境配置ConfigurableEnvironment。封装main方法的参数,写入到 Environment中,发布 ApplicationEnvironmentPreparedEvent(环境事件)。
(5)创建应用程序上下文ApplicationContext。ApplicationContext是Spring中的核心接口和容器,允许容器通过应用程序上下文环境创建、获取、管理bean。

public ConfigurableApplicationContext run(String... args) {
		// 创建并初始化计时器StopWatch,用来记录SpringBoot的启动时间
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();
		DefaultBootstrapContext bootstrapContext = createBootstrapContext();
		ConfigurableApplicationContext context = null;
		configureHeadlessProperty();
		// 创建并初始化监听器SpringApplicationRunListeners,并启动监听,用于监听run方法的执行
		SpringApplicationRunListeners listeners = getRunListeners(args);
		listeners.starting(bootstrapContext, this.mainApplicationClass);
		try {
		 	// 创建并初始化ApplicationArguments,获取run方法传递的args参数
			ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
			// 创建并初始化环境配置ConfigurableEnvironment。封装main方法的参数,写入到 Environment中,
			// 发布 ApplicationEnvironmentPreparedEvent(环境事件)。
			ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments);
			configureIgnoreBeanInfo(environment);
			Banner printedBanner = printBanner(environment);
			// 创建应用程序上下文ApplicationContext
			context = createApplicationContext();
			context.setApplicationStartup(this.applicationStartup);
			prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
			refreshContext(context);
			afterRefresh(context, applicationArguments);
			stopWatch.stop();
			if (this.logStartupInfo) {
				new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
			}
			listeners.started(context);
			callRunners(context, applicationArguments);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, listeners);
			throw new IllegalStateException(ex);
		}

		try {
			listeners.running(context);
		}
		catch (Throwable ex) {
			handleRunFailure(context, ex, null);
			throw new IllegalStateException(ex);
		}
		return context;
	}

首先,run()中定义了一个StopWatch类的实例stopWatch,并在该实例上调用start()方法,用于启动计时器记录应用程序启动过程中所用的时间。

然后,创建了一个DefaultBootstrapContext类的实例bootstrapContext,用于记录Spring Boot的启动上下文信息。

接着,调用了configureHeadlessProperty()方法来配置Headless模式。

然后,获取Spring Boot的启动监听器SpringApplicationRunListeners实例,并在它上面调用starting()方法,通知所有的启动监听器:
应用程序已经开始启动了。

在try块内,首先创建了一个ApplicationArguments实例applicationArguments,用于保存应用程序启动时的相关参数。

接着,调用prepareEnvironment()方法创建并准备ConfigurableEnvironment实例environment,包括加载所有的配置文件、设置激活的profile、
解析命令行参数等,并配置忽略bean的信息。

然后,调用printBanner()方法打印Spring Boot logo,同时将返回的Banner实例printedBanner保存。

紧接着,调用createApplicationContext()方法创建ApplicationContext实例context,并将applicationStartup配置到context实例中。

然后,调用prepareContext()方法,来准备上下文,包括配置beans、设置profiles、注册监听器等,并且将printedBanner通过
context的属性banner进行记录。在prepareContext()方法中还会回调SpringApplicationRunListeners实例的方法:contextPrepared()。

接下来,调用refreshContext()方法启动容器(这里涉及到Spring的容器启动顺序、扫描bean的逻辑等),达到Spring Bean的依赖注入功能。

然后,在Context刷新完成后,调用afterRefresh()方法,将相关的applicationContext和applicationArguments传入,对Spring Boot进行
后续的处理。

在stopWatch上调用stop()方法,计算出应用程序从启动到加载完毕所需的总时间。如果打开了日志输出,则调用StartupInfoLogger实例的方法
记录应用程序启动的日志。

接着,会调用SpringApplicationRunListeners实例的方法:started() 和callRunners()。

最后,在try块外,会再次回调SpringApplicationRunListeners实例的方法:running()。如果在try块中执行过程中,出现了异常,
则通过handleRunFailure()方法进行异常处理。整个方法最终会返回ApplicationContext实例context。

Spring Boot 的启动过程大致如下:

1. 创建启动计时器和Spring Boot启动上下文
2. 配置Headless模式
3. 创建和通知Spring Boot的启动监听器
4. 创建和准备应用程序运行参数、环境、解析命令行等
5. 打印Spring Boot Logo,并创建Spring IoC容器、注册监听器、配置Beans、设置Profiles等
6. 启动IoC容器,完成Bean的扫描、注入等工作
7. 容器加载完毕后,进行后续的处理操作
8. 停止计时器并记录应用程序启动的日志
9. 调用监听器已完成启动的方法和处理方法
10. 返回ApplicationContext实例。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SpringBoot启动流程可以分为以下几个步骤: 1. 确定应用程序类型。在启动SpringBoot时,首先需要确定应用程序的类型。这可以通过设置启动类的注解来实现,比如使用@SpringBootApplication注解。 2. 创建SpringBoot应用程序上下文。在确定应用程序类型后,SpringBoot会创建一个应用程序上下文(ApplicationContext)对象。这个上下文对象是整个应用程序的核心,包含了所有的配置信息和Bean定义。 3. 加载配置文件。SpringBoot会自动加载并解析应用程序的配置文件,包括application.properties或application.yml等。这些配置文件可以用来配置应用程序的各种属性,如数据库连接、端口号等。 4. 扫描和注册Bean。SpringBoot会扫描应用程序中的所有类,并将符合条件的类注册为Bean。这可以通过@ComponentScan注解来实现,它会扫描指定包及其子包中的所有类。 5. 执行Bean的初始化和依赖注入。在注册Bean后,SpringBoot会执行Bean的初始化操作,并将其依赖的其他Bean注入到其中。这可以通过使用@Autowired注解来实现。 6. 启动应用程序。在完成上述步骤后,SpringBoot会启动应用程序。这将导致应用程序开始监听指定的端口,并处理来自客户端的请求。 总而言之,SpringBoot启动流程包括确定应用程序类型、创建应用程序上下文、加载配置文件、扫描和注册Bean、执行Bean的初始化和依赖注入,最后启动应用程序。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [9千字长文带你了解SpringBoot启动过程--史上最详细 SpringBoot启动流程-图文并茂](https://blog.csdn.net/weixin_44947701/article/details/124055713)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路上阡陌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值