java web学习笔记--后端进阶(二)SpringBoot原理
Java Web 学习笔记 —— 后端进阶二Spring Boot 原理深度解析2026 年视角Spring Boot 的“魔法”其实就是一套精心设计的约定 配置 自动装配 事件驱动 生命周期管理机制。到 2026 年Spring Boot 3.2.x / 3.3.x 已经非常成熟启动性能优化AOT、GraalVM Native 支持、虚拟线程集成、结构化日志等新特性已经融入核心但最核心的启动流程与自动配置原理变化不大。下面从**“为什么这么简单就能跑起来”**的角度拆解最核心的几条主线带源码关键路径。一、SpringBootApplication 到底包含了什么三剑客SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}点开SpringBootApplicationTarget(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)DocumentedInheritedSpringBootConfiguration// 1. 标记这是一个配置类等价 ConfigurationEnableAutoConfiguration// 2. 开启自动配置最核心ComponentScan(// 3. 组件扫描默认当前包及其子包excludeFiltersFilter(typeFilterType.CUSTOM,classesTypeExcludeFilter.class),includeFiltersFilter(typeFilterType.CUSTOM,classesAutoConfigurationExcludeFilter.class))publicinterfaceSpringBootApplication{...}三剑客各自职责注解核心作用底层实现关键类SpringBootConfiguration声明这是一个 Spring 配置类—EnableAutoConfiguration开启自动配置最重要的魔法AutoConfigurationImportSelectorComponentScan扫描当前包及其子包下的 Component 等ClassPathBeanDefinitionScanner二、Spring Boot 启动流程全景SpringApplication.run() 核心步骤publicstaticConfigurableApplicationContextrun(Class?...primarySources,String[]args){returnnewSpringApplication(primarySources).run(args);}run() 方法核心流程简化版2026 年视角创建 SpringApplication 实例构造函数推断应用类型Servlet / Reactive / None设置 Application TypeServlet → AnnotationConfigServletWebServerApplicationContext加载所有 ApplicationContextInitializer初始化器加载所有 ApplicationListener监听器推断主类main 方法所在类run() 方法执行 12 大步骤最核心部分run() 方法内部主要做了以下事伪代码顺序 1. StopWatch 计时开始 2. 创建并启动 SpringApplicationRunListeners发布 ApplicationStartingEvent 3. 准备环境prepareEnvironment加载 application.properties/yaml、命令行参数、Profile 等 4. 创建并准备 ApplicationContextcreateApplicationContext prepareContext 5. 刷新上下文前准备prepareContext绑定环境、加载 banner、发布 ApplicationEnvironmentPreparedEvent 6. 刷新上下文refreshContext调用 Spring 经典的 refresh() 方法BeanFactoryPostProcessor、BeanPostProcessor、实例化单例等 7. 发布 ApplicationStartedEvent / ApplicationReadyEvent 8. 执行 RunnersApplicationRunner / CommandLineRunner 9. 异常处理 优雅关闭钩子 10. 计时结束 日志输出启动耗时关键节点时间线2026 年典型启动耗时占比参考环境准备~10–15%自动配置加载 条件评估~25–35%最耗时部分Bean 定义加载 实例化~30–40%内嵌容器启动Tomcat/Jetty/Undertow~10–20%Runners 执行~5%三、自动配置Auto-Configuration的核心原理最常考自动配置的本质一句话“根据类路径中存在的 jar 包按条件加载对应的 xxxAutoConfiguration 类”。核心链路EnableAutoConfiguration → AutoConfigurationImportSelectorEnableAutoConfiguration→Import(AutoConfigurationImportSelector.class)AutoConfigurationImportSelector 实现 DeferredImportSelector Group在processImports()阶段调用getAutoConfigurationEntry()从META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.importsSpring Boot 3.0 新格式或旧的spring.factories读取所有候选自动配置类条件过滤Conditional 家族ConditionalOnClassConditionalOnMissingBeanConditionalOnPropertyConditionalOnWebApplicationConditionalOnExpressionConditionalOnResource…2026 年变化点面试常问Spring Boot 3.0 优先使用META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports纯文本加载更快AOTAhead-of-Time编译时会提前评估所有 Conditional生成静态 Bean 定义GraalVM Native 关键启动性能优化延迟初始化Lazy、Bean 预加载、Class 数据共享CDS四、常见面试/源码追问链2025–2026 高频Spring Boot 启动类为什么可以不写 Configuration→ 因为 SpringBootApplication 包含了 SpringBootConfiguration自动配置类是怎么被加载的为什么加了 starter 就能自动生效→ spring.factories / .imports 文件 SpringFactoriesLoader / ImportSelectorsConditionalOnMissingBean 是什么时候生效的→ 在 AutoConfiguration 导入阶段ConfigurationClassPostProcessor为什么自定义的 Bean 能覆盖自动配置的 Bean→ 因为用户定义的 Bean 先加载ComponentScan 先扫描ConditionalOnMissingBean 看到已存在就不加载自动的Spring Boot 如何实现“jar 包直接运行”→ spring-boot-maven-plugin 打包成可执行 jar包含 org.springframework.boot.loader 内嵌容器如何自定义 Starter最常手写题写 xxxAutoConfiguration META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports写 xxxProperties ConfigurationProperties打包成 starter jar不带 main 方法Spring Boot 3 与 2.x 启动流程最大区别→ AOT 支持、GraalVM Native、虚拟线程默认支持、Jakarta EE 迁移、.imports 文件取代部分 factories五、总结一句话口诀背下来“Spring Boot Spring 约定优于配置 自动配置 内嵌容器 可执行 Jar 事件驱动 条件装配”核心魔法链SpringBootApplication → EnableAutoConfiguration → AutoConfigurationImportSelector → spring.factories / .imports → Conditional 条件过滤 → Bean 定义 → refresh() 刷新容器你现在对 Spring Boot 原理最想搞清楚的是哪一块是启动流程详细源码、自动配置条件评估细节、自定义 Starter 实战、AOT/GraalVM Native 变化还是 Spring Boot 3 与 2.x 的差异对比可以继续针对性深挖
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2439703.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!