news 2026/7/4 3:12:24

02-SpringBoot配置文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
02-SpringBoot配置文件

一、配置文件的使用

SpringBoot使用一个全局的配置文件(核心配置文件),配置文件名在约定的情况下是固定的;配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;

application.properties

application.yml

二、两种配置文件的格式

在springboot框架中,resource文件夹里可以存放配置的文件有两种:properties和yml。

1、application.properties的用法:扁平的k/v格式。(key/value)

server.port=8081 server.servlet.context-path=/tuling

2、application.yml的用法:树型结构 可读性更强 值前面一定要有空格

server: port: 8088 servlet: context-path: /tuling

三、配置文件的加载顺序

2.3.x:官方没有具体说明,实测以properties为准

2.4.0:如果指定了多个位置,则后一个位置可以覆盖前一个位置的值。

2.4.4:建议整个应用程序使用一种格式,如果您的配置文件的格式.properties和.yml都位于同一位置,则以properties优先级为准。

3.1.5:以.properties为准。

四、其它约定配置文件加载顺序

springboot启动还会扫描以下位置的application.properties或者application.yml文件作为Spring Boot的默认配置文件:

低:

1、classpath的根目录下的

2、classpath的根config/

3、项目根目录

如果当前项目是继承/耦合 关系maven项目的话,项目根目录=父maven项目的根目录

4、项目根目录/comfig

5、直接子目录/config

优先级由低到高,高优先级的配置会覆盖低优先级的配置;互补配置;

五、profile配置文件加载

Profile的意思是配置,对于应用程序来说,不同的环境要不同的配置。

SpringBoot框架提供了多profile的管理功能,我们可以使用profile功能来区分不同环境的配置。

1.Spring官方给出的语法规则是application-{properties}.properties(.yaml/.yml)。

2.如果需要创建自定义的properties文件时,可以用application-xxx-properties的命名方式。

六、配置文件值注入

1.@vaule

package com.example.hello.beans; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; import java.util.Map; //可以通过@Value + SPEL表达式来直接绑定springbooot配置文件中的值 @Component public class User { @Value("${user.username}") private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public List<String> getHobbies() { return hobbies; } public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; } public Map<Integer, String> getGirlFriend() { return girlFriend; } public void setGirlFriend(Map<Integer, String> girlFriend) { this.girlFriend = girlFriend; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } private Integer age; private Date birthday; private List<String> hobbies; private Map<Integer,String> girlFriend; private Address address; @Override public String toString() { return "User{" + "username='" + username + '\'' + ", age=" + age + ", birthday=" + birthday + ", hobbies=" + hobbies + ", girlFriend=" + girlFriend + ", address=" + address + '}'; } }
package com.example.hello.beans; import org.springframework.stereotype.Component; @Component public class Address { public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } private Integer id; private String desc; }

application.properties

user.username=123 server.port=8080

运行结果:

2.@ConfigurationProperties(prefix="user")

package com.example.hello.beans; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.stereotype.Component; import java.util.Date; import java.util.List; import java.util.Map; @Component @ConfigurationProperties(prefix ="user") public class User { // @Value("${user.username}") private String username; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public List<String> getHobbies() { return hobbies; } public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; } public Map<Integer, String> getGirlFriend() { return girlFriend; } public void setGirlFriend(Map<Integer, String> girlFriend) { this.girlFriend = girlFriend; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } // @Value("${user.age}") private Integer age; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday; private List<String> hobbies; private Map<Integer,String> girlFriend; private Address address; @Override public String toString() { return "User{" + "username='" + username + '\'' + ", age=" + age + ", birthday=" + birthday + ", hobbies=" + hobbies + ", girlFriend=" + girlFriend + ", address=" + address + '}'; } }
user: username: 徐庶 age: 25 birthday: 1999-01-01 hobbies: - 读书 - 游泳 - 编程 girlFriend: 1: 貂蝉 2: 小乔 address: id: 1 desc: 河南省郑州市 server: port: 8080

运行结果:

User{username='徐庶', age=25, birthday=Fri Jan 01 00:00:00 CST 1999, hobbies=[读书, 游泳, 编程], girlFriend={1=貂蝉, 2=小乔}, address=Address{id=1, desc='河南省郑州市'}}

松散绑定:

user: USERNAME: 徐庶 user: userName: 徐庶 user: user-name: 徐庶 user: user_name: 徐庶 以上四种命名是可以自动绑定bean属性 User.username

3.@ConfigurationProperties对比@Value 获取值

JSR303数据校验,二者都支持

4.配置文件占位符

@ConfigurationProperties不支持SPEL表达式,只支持两种占位符。

1.对属性值的引用占位符

2.对属性随机值的引用

补:SPEL表达式

分类核心内容示例表达式说明与用途
表达式的样子写在#{...}#{3 + 5}这是 SpEL 的标准语法,一眼就能认出来,区别于属性占位符${...}(用于读取外部配置文件)。
支持的数据类型字面量、数字、布尔、字符串、集合等#{'Hello'}
#{1 > 0}
#{1,2,3}
支持常见的 Java 数据类型,还可以直接写集合,比如 List 和 Map。
能做什么运算算术、比较、逻辑、三元、正则匹配#{1 + 2 * 3}
#{score >= 60}
#{age > 18 ? '成人' : '未成年'}
几乎覆盖了所有常见的运算逻辑,可以替代很多简单的 Java 判断代码。
如何访问数据操作对象属性、调用方法、访问容器 Bean#{user.name}
#{user.getName()}
#{@userService.findById(1)}
这是 SpEL 最核心的能力,可以灵活地读取或调用程序中的任何对象。用@前缀就能直接拿到 Spring 容器里的 Bean。
特殊的变量系统属性、方法参数、安全上下文等#{systemProperties['java.version']}
#{#param1}
#{authentication.name}
内置了很多常用对象,让你能方便地获取环境信息或当前请求的上下文。参数用#参数名来引用。
处理空值安全的导航操作符#{user?.address?.city ?: '未知'}?.会优雅地处理空指针,如果中间任何一个对象是null,就不会报错,直接返回null或指定的默认值。
主要应用场景注解赋值、权限校验、条件化配置@Value("#{...}")
@PreAuthorize("#{...}")
@ConditionalOnExpression("...")
这三个注解(见右侧)覆盖了 90% 以上的日常使用场景,让你的配置和代码变得非常灵活。

5.属性注入---数据校验

<!-- 数据校验--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'user' to com.example.hello.beans.User failed: Property: user.address Value: "null" Reason: 不能为null

七、总结

自定义配置文件绑定值

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 3:08:10

无感FOC与滑膜观测器在电机控制中的应用

1. 无感FOC与滑膜观测器概述在电机控制领域&#xff0c;无感FOC&#xff08;Field-Oriented Control&#xff09;技术正逐渐成为主流解决方案。这种技术最大的特点是不需要机械传感器就能精确控制电机运行&#xff0c;既降低了系统成本又提高了可靠性。而实现这一目标的核心&am…

作者头像 李华
网站建设 2026/7/4 3:05:54

1kW高效BLDC电机设计:医疗设备应用与转矩脉动控制

1. 项目背景与核心挑战在工业自动化和小型动力系统领域&#xff0c;直流无刷电机(BLDC)因其高效率、长寿命和低维护特性已成为现代驱动系统的首选方案。这个1kW高效电机设计案例源自我们为某精密医疗设备配套开发的动力模块需求&#xff0c;核心指标要求转矩脉动控制在额定值的…

作者头像 李华
网站建设 2026/7/4 3:05:38

保姆级外部字幕添加教程 3步搞定播放器字幕加载

给视频播放器添加外部字幕可通过同名自动加载、拖拽导入、手动菜单选择三种通用方法完成&#xff0c;搭配支持多格式字幕的播放器可进一步提升操作效率。外挂字幕添加通用操作步骤同名自动加载&#xff08;推荐&#xff09;&#xff1a;将视频文件和字幕文件放在同一文件夹&…

作者头像 李华
网站建设 2026/7/4 3:05:36

aixingpan.cn API开发文档:api_docs_onechart_lunar_return2接口指南

aixingpan.cn API开发文档&#xff1a;api_docs_onechart_lunar_return2接口指南 1. 引言 本文档详细介绍了占星系统的api_docs_onechart_lunar_return2接口的使用方法&#xff0c;包括请求参数详解、响应数据结构、错误处理机制以及最佳实践建议。 2. 接口基础信息 接口名称: …

作者头像 李华