SpringBoot中多配置文件和外部配置文件加载顺序
一、项目基础信息1. 项目结构基于 Maven 构建的 Spring Boot 项目核心依赖包含 web、validation、devtools 等JDK 版本17Spring Boot 版本3.2.02. 核心 POM 配置xmlproject xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdcom.qcby/groupId artifactIddemo10/artifactId version1.0-SNAPSHOT/version packagingjar/packaging parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version /parent properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding /properties dependencies !-- Web 核心依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 测试依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency !-- 热部署依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-devtools/artifactId optionaltrue/optional /dependency !-- 参数校验依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-validation/artifactId /dependency /dependencies /project二、配置文件语法Spring Boot 支持application.properties和application.yml两种配置格式优先读取 yml层级更清晰。1. 基础配置示例application.ymlyaml# 应用配置 app: name: demo-app port: 8081 allowed-ips: [127.0.0.1, 192.168.1.1] # 复杂对象配置 person: last-name: 张三${random.uuid} # 拼接随机UUID age: ${random.int} # 随机整数 birth: 2017/12/15 # 日期类型 boss: false # 布尔类型 maps: # Map类型 k1: v1 k2: 14 lists: [a, b, c] # List类型 dog: # 嵌套对象 name: ${person.hello:hello}_dog # 占位符默认值 age: 15 # 用户配置用于校验 user: id: 1 username: # 空值用于校验演示 password: 123456 age: 25 email: lisiexample.com2. properties 格式对比application.propertiesproperties# 注意properties 中特殊字符需转义层级用 . 分隔 person.last-name张三${random.uuid} person.age${random.int} person.birth2017/12/15 person.bossfalse person.maps.k1v1 person.maps.k214 person.listsa,b,c person.dog.name${person.hello:hello}_dog person.dog.age153. 核心语法说明占位符${key}引用其他配置${key:默认值}当 key 不存在时使用默认值随机值${random.uuid}随机 UUID、${random.int}随机整数复杂类型Map、List、嵌套对象均支持yml 用缩进表示层级properties 用.分隔层级。三、配置绑定方式1. ConfigurationProperties推荐批量绑定核心规则注解加在类上通过prefix指定配置前缀类必须交给 Spring 容器管理Component必须提供 getter/setter 方法Spring 底层通过反射赋值支持复杂类型Map、List、嵌套对象。示例 1Person 类绑定配置java运行package com.qcby.model; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Map; import java.util.List; import java.util.Date; Component // 交给Spring容器管理 ConfigurationProperties(prefix person) // 绑定person前缀的配置 public class Person { private String lastName; private Integer age; private Date birth; private Boolean boss; private MapString, Object maps; private ListObject lists; private Dog dog; // 嵌套对象 // 嵌套静态内部类也可单独定义 public static class Dog { private String name; private Integer age; // 必须提供getter/setter public String getName() { return name; } public void setName(String name) { this.name name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } Override public String toString() { return Dog{ name name \ , age age }; } } // 所有属性的getter/setter public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName lastName; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth birth; } public Boolean getBoss() { return boss; } public void setBoss(Boolean boss) { this.boss boss; } public MapString, Object getMaps() { return maps; } public void setMaps(MapString, Object maps) { this.maps maps; } public ListObject getLists() { return lists; } public void setLists(ListObject lists) { this.lists lists; } public Dog getDog() { return dog; } public void setDog(Dog dog) { this.dog dog; } Override public String toString() { return Person{ lastName lastName \ , age age , birth birth , boss boss , maps maps , lists lists , dog dog }; } }示例 2Value 单个绑定Value适合单个配置注入不支持复杂类型Map/List语法更灵活支持 SpEL。java运行package com.qcby.model; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; Component public class ValueDemo { // 注入单个配置值 Value(${app.name}) private String appName; // 支持默认值当app.port不存在时使用8080 Value(${app.port:8080}) private Integer appPort; // 支持SpEL表达式Spring表达式语言 Value(#{T(java.lang.Math).random() * 100}) private Double randomNum; Override public String toString() { return ValueDemo{ appName appName \ , appPort appPort , randomNum randomNum }; } }2. ConfigurationProperties vs Value 对比特性ConfigurationPropertiesValue批量绑定支持不支持复杂类型Map/List支持不支持SpEL 表达式不支持支持默认值支持配置文件中支持注解中校验注解支持配合 Validated不支持四、参数校验JSR-380基于jakarta.validation注解配合Validated开启校验需引入spring-boot-starter-validation依赖。1. 核心注解说明注解作用适用类型NotNull不能为 null所有类型NotBlank不能为 null / 空字符串 / 全空格字符串字符串Min(value)最小值数值类型int/longMax(value)最大值数值类型Email邮箱格式校验字符串2. 校验示例User 类java运行package com.qcby.model; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Min; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; Component ConfigurationProperties(prefix user) Validated // 开启参数校验核心 public class User { private Long id; NotBlank(message 用户名不能为空) // 字符串非空校验 private String username; NotBlank(message 密码不能为空) private String password; NotNull(message 年龄不能为空) // 不能为null Min(value 18, message 年龄不能小于18岁) // 最小值校验 private Integer age; private String email; // getter/setter 必须提供 public Long getId() { return id; } public void setId(Long id) { this.id id; } public String getUsername() { return username; } public void setUsername(String username) { this.username username; } public String getPassword() { return password; } public void setPassword(String password) { this.password password; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age age; } public String getEmail() { return email; } public void setEmail(String email) { this.email email; } Override public String toString() { return User{ id id , username username \ , age age , email email \ }; } }3. 校验生效规则必须在类上添加Validated注解校验注解加在字段上支持自定义提示语message若配置值不满足校验规则项目启动时会抛出BindException异常。五、配置绑定实战Controller 调用通过Autowired注入绑定配置的类直接使用配置值。java运行package com.qcby.controller; import com.qcby.model.Person; import com.qcby.model.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController // 等同于Controller ResponseBody public class HelloController { Autowired // 注入配置绑定的Person对象 private Person person; Autowired // 注入配置绑定的User对象 private User user; RequestMapping(/list) public void printConfig() { // 打印配置值 System.out.println(person); System.out.println(user); } }六、Spring 容器配置补充1. 配置类注册 BeanConfiguration Beanjava运行package com.qcby.config; import com.qcby.service.HelloService; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; // 标记为配置类替代xml配置 Configuration public class MyAppConfig { // 注册Bean到容器默认名称为方法名helloService Bean public HelloService helloService(){ System.out.println(配置类Bean给容器中添加组件了...); return new HelloService(); } }2. 导入 XML 配置ImportResource若需兼容传统 XML 配置在启动类添加注解java运行package com.qcby; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ImportResource; // 导入XML配置文件beans.xml SpringBootApplication ImportResource(locations classpath:beans.xml) public class Demo10Application { public static void main(String[] args) { SpringApplication.run(Demo10Application.class, args); } }七、核心注意事项配置绑定必须有 getter/setterSpring 底层通过 set 方法赋值无 set 方法则属性为 null配置前缀要匹配ConfigurationProperties(prefix person)需与配置文件中的 person 层级一致校验依赖必须引入Spring Boot 3.x 后校验注解从javax.validation迁移到jakarta.validation需引入spring-boot-starter-validation热部署生效条件devtools 依赖需加optionaltrueIDEA 需开启自动编译Settings - Build - Compiler - Build project automatically配置文件优先级application.yml application.properties同一配置在 yml 中定义会覆盖 properties。总结Spring Boot 配置绑定优先使用ConfigurationProperties批量绑定、支持复杂类型单个配置可使用Value支持 SpEL参数校验需引入 validation 依赖配合Validated和jakarta.validation注解使用配置文件中 yml 格式层级更清晰优先级高于 properties核心语法包含占位符、随机值、复杂类型定义。

相关新闻

@PropertySource@ImportResource@Bean

@PropertySource@ImportResource@Bean

2026/7/8 14:21:44 阅读更多 →
Python入门——字符串

Python入门——字符串

2026/7/8 22:43:00 阅读更多 →
Java中strip与trim()的区别

Java中strip与trim()的区别

2026/7/8 12:48:09 阅读更多 →

最新新闻

粉笔OMO模式解析:线上线下打通,数据闭环怎么玩?

粉笔OMO模式解析:线上线下打通,数据闭环怎么玩?

核心结论:粉笔的OMO(Online-Merge-Offline)模式是公考培训行业"线上技术线下体验"融合的代表性案例。其核心逻辑是:线上承担"内容交付数据采集AI辅助"的功能,线下承担"学习氛围互动答疑模拟实…

2026/7/9 6:13:28 阅读更多 →
学生最常用的AI软件怎么选

学生最常用的AI软件怎么选

学生群体用AI,核心需求很明确:免费额度够用、零基础能上手、中文回答自然、能覆盖学习与创作场景,还能适配课程作业、论文、项目、复习等不同任务。下面从主流AI软件出发,结合学生高频使用场景,聊聊每款工具的真实定位…

2026/7/9 6:07:27 阅读更多 →
2026微信小程序开店找哪家公司,小程序模板数量和质量横向测评

2026微信小程序开店找哪家公司,小程序模板数量和质量横向测评

今天给大家带来2026微信小程序开店找哪家公司,小程序模板数量和质量横向测评。据WeChat Mini Program Development Guide 2025数据显示,截至2024年微信小程序总数已突破430万个,95%的中国企业拥有自己的小程序;腾讯控股2025年财报…

2026/7/9 6:07:27 阅读更多 →
微信API结合GEO:如何用Python自动把私域聊天沉淀为知识库资产

微信API结合GEO:如何用Python自动把私域聊天沉淀为知识库资产

在大模型搜索(Generative Engine Optimization, GEO)时代,企业最核心的资产就是高价值的真实问答语料。个人微信是私域流量的源头,用户在里面的提问,恰恰是企业最真实的“痛点数据”。 今天不扯大模型怎么调&#xff…

2026/7/9 6:07:27 阅读更多 →
昆仑万维四大AI模型开源部署指南:世界模型、视频生成、音乐创作与智能体实战

昆仑万维四大AI模型开源部署指南:世界模型、视频生成、音乐创作与智能体实战

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在WAIC世界人工智能大会上,昆仑万维发布了四大AI模型技术矩阵,涵盖世界模型、视频生成、音乐创作和机器人…

2026/7/9 6:05:27 阅读更多 →
车间地面选型避坑:三个真实案例,看懂钱该往哪花

车间地面选型避坑:三个真实案例,看懂钱该往哪花

干工装二十年,我见过最可惜的画面不是设备坏了,是设备好好的,地面先废了。老板站在车间门口,看着崭新的设备搁在起砂起皮的地面上,进退两难——铲掉重做,产线得停;硬撑下去,越跑越糟…

2026/7/9 6:03:26 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻