SpringBoot杂记

SpringBoot启动流程解析

启动


入口

@SpringBootApplication
public class XlcqqApplication {
	public static void main(String[] args) {
		SpringApplication.run(XlcqqApplication.class, args);
	}
}

整个项目将从SpringApplication.run()这个关键方法启动,SpringApplication是引导SpringBoot启动的一个工具类,这个类提供的run()是一个关键方法,其中最重要的功能就是创建spring的context

创建SpringContext

run()源码片段如下

try {
			......
			context = createApplicationContext();
			......
			prepareContext(context, environment, listeners, applicationArguments,
					printedBanner);
			refreshContext(context);
			......
		}

可见就是调用了createApplicationContext()来创建context的,进入createApplicationContext方法:

Class<?> contextClass = this.applicationContextClass;
		if (contextClass == null) {
			try {
				switch (this.webApplicationType) {
				case SERVLET:
					contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS);
					break;
				case REACTIVE:
					contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS);
					break;
				default:
					contextClass = Class.forName(DEFAULT_CONTEXT_CLASS);
				}
			}

会发现SpringBoot将根据webApplicationType属性来创建对应的context实例,预定义的两个实例class为

	public static final String DEFAULT_SERVLET_WEB_CONTEXT_CLASS = "org.springframework.boot."
			+ "web.servlet.context.AnnotationConfigServletWebServerApplicationContext";


	public static final String DEFAULT_REACTIVE_WEB_CONTEXT_CLASS = "org.springframework."
			+ "boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext";

至此,便知道SpringBoot启动Spring其实就只是根据当前环境,创建了AnnotationConfigServletWebServerApplicationContext或者AnnotationConfigReactiveWebServerApplicationContext二者之一来作为Spring的context。

加载Spring的Bean

在上面的run()方法中,创建了spring context之后,接着要加载bean,这是在第二步 prepareContext()中完成的。源码如下:

private void prepareContext(ConfigurableApplicationContext context,
			ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,
			ApplicationArguments applicationArguments, Banner printedBanner) {
		context.setEnvironment(environment);
		...... //一系列准备工作
		load(context, sources.toArray(new Object[0]));
		listeners.contextLoaded(context);
	}

上面的方法中,最后用调用了load()这个方法,进入load()

protected void load(ApplicationContext context, Object[] sources) {
		if (logger.isDebugEnabled()) {
			logger.debug(
					"Loading source " + StringUtils.arrayToCommaDelimitedString(sources));
		}
		BeanDefinitionLoader loader = createBeanDefinitionLoader(
				getBeanDefinitionRegistry(context), sources);
		if (this.beanNameGenerator != null) {
			loader.setBeanNameGenerator(this.beanNameGenerator);
		}
		if (this.resourceLoader != null) {
			loader.setResourceLoader(this.resourceLoader);
		}
		if (this.environment != null) {
			loader.setEnvironment(this.environment);
		}
		loader.load();
	}

这个方法中,创建了一个 BeanDefinitionLoader的实例loader,而这个loader,就是spring中用来加载bean的loader,从这里开始,后续也就是在执行spring原有的加载bean的一系列功能了。

小结:

对于以上SpringBoot启动的三步总结如下:

  1. 首先SpringBoot的入口main函数中,调用了SpringApplication.run()方法,这个方法主要用途是创建一个spring context实例
  2. 在run()中,将根据当前项目环境,创建一个对应的spring context
  3. 创建了srping context之后,会委托spring原有的BeanDefinitionLoader来加载bean

以上是SpringBoot启动的主要步骤,但是非常粗略,其中还涉及到非常多的事情,例如一个starter是如何做到自动配置启动的,Spring WEB启动的时候是如何自动启动tomcat的等等。

 

课程设计报告:总体方案设计说明 一、软件开发环境配置 本系统采用C++作为核心编程语言,结合Qt 5.12.7框架进行图形用户界面开发。数据库管理系统选用MySQL,用于存储用户数据与小精灵信息。集成开发环境为Qt Creator,操作系统平台为Windows 10。 二、窗口界面架构设计 系统界面由多个功能模块构成,各模块职责明确,具体如下: 1. 起始界面模块(Widget) 作为应用程序的入口界面,提供初始导航功能。 2. 身份验证模块(Login) 负责处理用户登录与账户注册流程,实现身份认证机制。 3. 游戏主大厅模块(Lobby) 作为用户登录后的核心交互区域,集成各项功能入口。 4. 资源管理模块(BagWidget) 展示用户持有的全部小精灵资产,提供可视化资源管理界面。 5. 精灵详情模块(SpiritInfo) 呈现选定小精灵的完整属性数据与状态信息。 6. 用户名录模块(UserList) 系统内所有注册用户的基本信息列表展示界面。 7. 个人资料模块(UserInfo) 显示当前用户的详细账户资料与历史数据统计。 8. 服务器精灵选择模块(Choose) 对战准备阶段,从服务器可用精灵池中选取参战单位的专用界面。 9. 玩家精灵选择模块(Choose2) 对战准备阶段,从玩家自有精灵库中筛选参战单位的操作界面。 10. 对战演算模块(FightWidget) 实时模拟精灵对战过程,动态呈现战斗动画与状态变化。 11. 对战结算模块(ResultWidget) 对战结束后,系统生成并展示战斗结果报告与数据统计。 各模块通过统一的事件驱动机制实现数据通信与状态同步,确保系统功能的连贯性与数据一致性。界面布局遵循模块化设计原则,采用响应式视觉方案适配不同显示环境。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值