当前位置: 代码网 > it编程>编程语言>Java > Spring Boot自动装配、启动流程、配置优先级问题记录

Spring Boot自动装配、启动流程、配置优先级问题记录

2025年12月27日 Java 我要评论
问题 1:spring boot 自动装配的核心原理是什么?spring boot 自动装配的核心依赖于 @enableautoconfiguration 注解(该注解被 @springbootapp

问题 1:spring boot 自动装配的核心原理是什么?

spring boot 自动装配的核心依赖于 @enableautoconfiguration 注解(该注解被 @springbootapplication 组合注解包含,无需单独声明)。

核心流程:

  • 注解驱动:@enableautoconfiguration 通过 @import(autoconfigurationimportselector.class) 导入核心选择器类;
  • 扫描配置:autoconfigurationimportselector 借助 springfactoriesloader 工具,扫描项目所有依赖包下的 meta-inf/spring.factories 文件(spring boot 2.x 版本),该文件中配置了大量自动配置类全路径(如 datasourceautoconfigurationwebmvcautoconfiguration);
  • 条件筛选:自动配置类需满足预设条件才会生效,核心依赖 spring 条件注解(如 @conditionalonclass 检查类路径是否存在指定类、@conditionalonmissingbean 检查用户是否自定义同类型 bean、@conditionalonproperty 检查配置文件是否开启对应开关);
  • 配置生效:满足条件的自动配置类被 spring 容器加载,完成 bean 自动注册,实现“开箱即用”。

总结:spring boot 自动装配并非“全自动”,而是“有条件的自动装配”。核心是 @enableautoconfiguration 注解 + springfactoriesloader 扫描机制 + 条件注解筛选的组合逻辑,既实现了简化配置,又保证了灵活可控。(注:spring boot 3.x 版本将自动配置类清单迁移至 meta-inf/spring/org.springframework.boot.autoconfigure.autoconfiguration.imports 文件,核心逻辑不变)

问题 2:spring boot 应用的完整启动流程(尤其是 web 项目)

spring boot 的启动流程可以拆分为两个核心阶段:初始化 springapplication 实例执行 run() 方法

整个流程始终围绕三个核心目标展开:准备运行环境、创建并初始化应用上下文、启动核心业务逻辑

阶段一:执行 main 方法 & 初始化 springapplication

spring boot 应用的启动入口是 main 方法,核心调用为:

springapplication.run(application.class, args);

在该调用中,首先会创建一个 springapplication 实例,并完成以下三件关键事情:

  1. 推断应用类型(web / 非 web / reactive):通过检查类路径中是否存在 servlet(web 应用)、reactivewebapplicationcontext(响应式应用)相关类来判定,决定后续创建的应用上下文类型;
  2. 加载初始化器与监听器:从 meta-inf/spring.factories 中加载并实例化 applicationcontextinitializer(应用上下文初始化器)和 applicationlistener(应用事件监听器),这是后续自动装配和事件机制生效的关键前置步骤;
  3.  记录主启动类:定位并存储 main 方法所在的启动类,为后续 @componentscan 扫描配置类提供依据。

阶段二:执行 run() 方法(核心启动逻辑)

run() 方法是 spring boot 启动流程的核心入口,其内部按顺序完成以下五个关键步骤:

  • 准备运行环境(environment):加载命令行参数、jvm 系统属性、环境变量、application.yml/properties 等配置来源,封装为 configurableenvironment 实例;并完成环境配置的校验与激活(如激活指定 profile);
  •  创建应用上下文(applicationcontext):根据阶段一推断的应用类型,创建对应类型的应用上下文(web 应用默认创建annotationconfigservletwebserverapplicationcontext);将阶段一准备的环境对象绑定到上下文;
  •  刷新应用上下文(refresh()):这是启动流程的核心步骤,完成 bean 定义加载、bean 实例化与依赖注入、事件监听器注册等工作;对于 web 项目,此阶段会调用 createwebserver() 方法,通过 servletwebserverfactory 工厂创建并启动嵌入式 tomcat 服务器;
  •  执行启动后运行器(applicationrunner / commandlinerunner):遍历 spring 容器中所有实现这两个接口的 bean,按顺序执行其 run() 方法,用于执行启动后的初始化任务(如加载基础数据、打印启动日志);两者区别:applicationrunner 接收解析后的 applicationarguments 对象,commandlinerunner 接收原始命令行字符串数组;
  •  发布应用就绪事件(applicationreadyevent):通过事件机制发布应用就绪事件,标识应用已完全启动,此时应用进入运行状态,可正常接收并处理外部请求。

问题 3:spring boot web 项目如何启动嵌入式 web 服务器?

答:spring boot web 项目的嵌入式 web 服务器(默认 tomcat),核心是在 应用上下文刷新(refresh())阶段 启动,具体流程如下:

  • 依赖触发:项目引入 spring-boot-starter-web 依赖时,spring boot 会通过自动装配机制,加载 servletwebserverfactoryautoconfiguration 自动配置类;
  • 工厂创建:该自动配置类会根据类路径中的 web 服务器依赖(如 tomcat、jetty),自动注册对应的 servletwebserverfactory 工厂实例(默认注册 tomcatservletwebserverfactory);
  • 上下文绑定:阶段二创建应用上下文时,web 应用会使用 annotationconfigservletwebserverapplicationcontext,该上下文内置了 web 服务器启动逻辑;
  • 服务器启动:在 refresh() 方法执行过程中,会调用 createwebserver() 方法,该方法通过 servletwebserverfactory 工厂创建 tomcatwebserver 实例,内部调用 tomcat.start() 启动服务器;同时将项目中的 servlet(如 dispatcherservlet)注册到服务器;
  • 就绪可用:服务器启动完成后,随应用就绪事件发布,开始监听指定端口(默认 8080),接收 http 请求。

问题 4:spring boot 配置属性的优先级顺序

spring boot 支持多种外部配置来源,优先级明确(数字越小,优先级越高,后加载的配置会覆盖先加载的同名配置):

优先级

配置来源

示例

1

命令行参数

--server.port=8081

2

jvm 系统属性(-d 参数)

-dserver.port=8082

3

操作系统环境变量

windows:set server_port=8083;linux/mac:export server_port=8083

4

bootstrap.yml / bootstrap.properties(spring cloud 特有)

spring.application.name=cloud-demo

5

远程配置中心(如 spring cloud config server)

spring.datasource.url=jdbc:mysql://xxx:3306/db

6

激活的 profile 配置文件(application-{profile}.yml / .properties)

application-prod.yml(需通过 spring.profiles.active=prod 激活)

7

默认全局配置(application.yml / application.properties)

application.yml 中配置 server.port=8080

8

@propertysource 注解加载的自定义配置文件

@propertysource("classpath:custom.properties")

9

应用代码中设置的默认值

springapplication.setdefaultproperties(collections.singletonmap("server.port", 8084))

profile 规则:激活的 profile 配置文件优先级高于默认全局配置,即 application-{profile}.yml / .properties > application.yml / .properties;若同时激活多个 profile,后激活的 profile 配置会覆盖先激活的。

问题 5:application.yml 和 application.properties 哪个优先级更高?

答:在 spring boot 中,application.ymlapplication.properties 属于同一优先级层级,当两者并存且存在同名配置时,后被 spring 加载的配置会覆盖先加载的

默认加载顺序:spring boot 会先加载 application.properties,再加载 application.yml,因此同名配置最终生效的是application.yml 的配置;但该顺序可通过自定义配置加载逻辑修改,核心原则是“同层级配置,后加载覆盖先加载”。

注意:若两者与 profile 结合(如 application-prod.yml 和 application-prod.properties),规则相同——同一 profile 下的 properties 和 yml 同优先级,后加载者覆盖先加载者。

问题 6:spring cloud 中的 bootstrap.yml 是什么?和 application.yml 有何区别?

答:

核心特性:bootstrap.yml 是 spring cloud 生态特有的启动级配置文件,基于 spring cloud 的“引导上下文(bootstrap context)”机制加载。引导上下文是应用主上下文的父上下文,优先级更高,主要用于加载应用启动过程中“必须提前准备的核心配置”(如远程配置中心地址、服务注册中心地址、应用名称等),确保这些配置在主上下文初始化前就绪。

与 application.yml 区别

特性

bootstrap.yml

application.yml

加载时机

引导上下文初始化前(应用启动最早期)

应用主上下文初始化时

依赖机制

依赖 spring cloud 引导机制,无 spring cloud 依赖时不生效

spring boot 原生支持,无需额外依赖

典型用途

1. 配置远程配置中心地址(spring.cloud.config.uri);2. 配置服务注册中心地址(eureka.client.serviceurl.defaultzone);3. 定义应用名称(spring.application.name,用于服务发现和配置中心定位);4. 配置加密/解密密钥(用于解密配置中心的敏感配置)

1. 应用端口(server.port);2. 数据库连接信息(spring.datasource.*);3. 日志配置(logging.*);4. 业务自定义属性(如 user.name)

优先级

更高(覆盖同名的 application.yml 配置)

更低(被 bootstrap.yml 同名配置覆盖)

profile 支持

支持 bootstrap-{profile}.yml,优先级:bootstrap-{profile}.yml > bootstrap.yml

支持 application-{profile}.yml,优先级:application-{profile}.yml > application.yml

到此这篇关于spring boot自动装配、启动流程、配置优先级问题记录的文章就介绍到这了,更多相关spring boot自动装配 启动流程 配置优先级内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com