面试题答案
一键面试- 加载顺序
- 优先级从高到低:
- 命令行参数:在启动Spring Boot应用时通过命令行传递的参数,例如
java -jar myapp.jar --server.port=8081
,这种方式优先级最高。 SPRING_APPLICATION_JSON
中的属性:可以通过环境变量SPRING_APPLICATION_JSON
指定JSON格式的配置,如SPRING_APPLICATION_JSON='{"server.port":8082}'
。- 操作系统环境变量:系统的环境变量,例如
SERVER_PORT
。 - JVM系统属性(
System.getProperties()
):在启动应用时通过-D
参数设置的属性,如java -Dserver.port=8083 -jar myapp.jar
。 RandomValuePropertySource
:用于生成随机数的属性源,如random.int
等。- 应用配置文件:
application-{profile}.properties
或application-{profile}.yml
(带特定环境配置的文件):针对不同运行环境(如dev
、prod
等)的配置文件,优先加载与当前激活环境匹配的配置文件。application.properties
或application.yml
:通用的应用配置文件,是整个应用的基础配置。
@PropertySource
注解加载的属性:通过在Java配置类中使用@PropertySource
注解指定的属性文件,优先级低于应用配置文件。- 默认属性:Spring Boot内部的默认属性设置。
- 命令行参数:在启动Spring Boot应用时通过命令行传递的参数,例如
- 优先级从高到低:
- 原因
- 灵活性与可定制性:命令行参数优先级最高,是因为它允许运维人员在不修改代码和配置文件的情况下,灵活地调整应用的运行参数,比如修改端口号、数据库连接字符串等,适用于不同的部署环境。
- 环境特定配置优先:
application-{profile}.properties
或application-{profile}.yml
优先于application.properties
或application.yml
加载,这样可以针对不同的运行环境(开发、测试、生产等)进行差异化配置,保证各环境下应用的正确运行,同时又能共享通用的基础配置。 - 常规配置基础:
application.properties
或application.yml
作为通用配置,提供了应用的基本配置信息,在没有特定环境配置覆盖的情况下,这些配置会生效。 - 细粒度配置控制:
@PropertySource
注解加载的属性文件可以在代码层面更细粒度地控制配置的加载,比如加载一些特定模块的配置文件。但它优先级低于应用配置文件,这样可以保证应用整体配置的一致性和优先级。 - 兜底默认值:默认属性作为最后的兜底设置,在其他配置都没有指定的情况下,提供一些合理的默认值,确保应用能以基本可用的状态启动。