恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
SpringApplication启动流程源码解析
首页
资讯中心
/
SpringApplication启动流程源码解析
SpringApplication启动流程源码解析
发布时间:2026/10/14 17:04:12
从main方法的SpringApplication.run()开始这里是使用类名调用静态方法这是启动的入口contrlb进入源码看到这个run方法在这里面这个静态run方法的实现分为两步骤第一先初始化实例SpringApplication,然后再调用SpringApplication的run方法2.1 在new SpringApplication中是通过构造函数进行初始化在这里SpringBoot会推断web应用类型,是reactive/servlet/nonethis.properties.setWebApplicationType(WebApplicationType.deduce());之后加载 Initializers 和 Listeners: Spring Boot 会从META-INF/spring.factories在 Spring Boot 3.x 中主要迁移到了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件但spring.factories依然为了兼容性而存在文件中加载ApplicationContextInitializer和ApplicationListener接口的实现类this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class)); this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));2.2 run方法核心步骤讲解Startup机制计时在SpringBoot2.3及以前,run方法一开始就启动StopWatch来计时但是现在使用了Startup机制来计时为什么换了原因如下StopWatch太简单了只能记录“总耗时”。而在 Spring Boot 3.x 中开发者需要更细粒度的监控比如Environment 准备花了多久Bean 初始化花了多久Tomcat 启动花了多久。Startup机制引入了一个名为ApplicationStartup的接口它支持记录启动过程中的每一个步骤Step功能比StopWatch强大得多Evironment准备prepareEnvironment()方法在容器创建之前执行负责创建Environment并加载所有配置源。加载顺序优先级从低到高后加载的覆盖先加载的如下application.yml/application.properties最低优先级。操作系统环境变量高于配置文件。JVM 系统属性-D参数高于环境变量。命令行参数--server.port9090最高优先级创建 ApplicationContext根据 Web 类型选择Spring Boot 会根据之前在new Application中推断的WebApplicationType在createApplicationContext()方法中创建对应的容器。Web 应用类型创建的 ApplicationContext 实现SERVLETAnnotationConfigServletWebServerApplicationContextREACTIVEAnnotationConfigReactiveWebServerApplicationContextNONEAnnotationConfigApplicationContextrefreshContext()这里标志着Spring IOC的正式初始化和启动内部完成了大量工作会扫描创建装配所有Beanrefresh完成后整个应用就启动完毕了run方法return ApplicationContext容器