
整体一句话概括执行 SpringApplication.run(启动类.class, args) 分两大阶段——准备阶段创建 SpringApplication 对象预加载环境、推断项目类型、加载自动配置类运行阶段创建容器、加载配置、扫描 Bean、启动内置 Tomcat对外提供接口。一、第一步new SpringApplication() 实例化对象做 3 件事1. 记录主启动类把我们写的 HospitalManagerApplication 存起来后续扫描以此为根包。2. 推断应用类型看项目有没有 Tomcat 依赖 → 判定为 Web 应用会创建内嵌 Tomcat 容器无 Web 依赖就是普通 Java 程序。3. 加载 SPI 自动配置类读取 META-INF/spring.factories 文件提前加载所有场景自动配置类MyBatis、Redis、Web、Tomcat 等这就是 Spring Boot 自动配置的核心来源。二、第二步调用 run() 核心方法启动全过程1. 开启启动计时器打印 Banner就是启动时控制台那个 Spring 图案可自定义关闭。2. 创建并准备运行环境 Environment加载所有配置yml、properties、命令行参数、系统环境变量区分多环境 dev/prod把配置统一封装后面容器直接读取校验配置是否合法端口、数据库地址等配置错误这里提前抛异常。3. 创建 Spring IOC 容器ApplicationContext根据前面推断的 Web 类型创建 AnnotationConfigServletWebServerApplicationContext 容器所有对象都存在这个容器里。4. 准备容器上下文加载主启动类配置把我们的启动类 HospitalManagerApplication 作为配置类注册进容器SpringBootApplication 复合注解开始生效ComponentScan扫描启动类同包及子包下所有加了 Controller / Service / Mapper / Component 的类标记为 BeanEnableAutoConfiguration拿出第一步加载的 spring.factories 自动配置类根据项目依赖按需创建组件引入 MyBatis-Plus 依赖 → 自动创建数据源、SqlSession、Mapper 代理对象引入 Redis 依赖 → 自动创建 RedisTemplateConfiguration启动类本身也能写 Bean 方法注册自定义对象。5. MapperScan 生效MapperScan(com.bear.hospital.mapper) 单独扫描 mapper 包自动给所有 Mapper 接口生成代理实现类注入容器Service 才能直接 Autowired 注入 Mapper 操作数据库。6. 刷新容器 refresh()最核心步骤这是 Spring 原生核心方法内部流程扫描所有 Bean 定义Controller、Service、Mapper、配置类实例化单例 Bean完成依赖注入Autowired 自动赋值执行 AOP 动态代理、事务管理、拦截器、全局异常处理器初始化初始化第三方组件Redis 连接池、数据库连接池、OSS 工具等。7. 创建内置 Web 服务器Tomcat/Jetty容器刷新完成后检测是 Web 项目自动创建 Tomcat绑定 yml 配置的端口默认 8080。8. 启动 Tomcat绑定 Spring 容器Tomcat 启动把 Spring 容器交给 Tomcat 管理监听浏览器/前端发来的 HTTP 请求请求进来会分发到对应 Controller 接口。9. 执行所有 ApplicationRunner / CommandRunner项目启动完成后执行自定义后置任务比如初始化缓存、加载字典数据。10. 启动完成打印日志服务运行中控制台输出启动耗时、访问地址服务常驻运行等待请求。