spring boot 提供了灵活多样的方式来读取配置文件(如 application.yml 或 application.properties),本文介绍几种常见的读取方式。
1. 配置文件位置与加载顺序
spring boot 默认从以下位置加载配置文件(优先级从高到低):
命令行参数(如:--server.port=8081)
application.properties / application.yml(位于 classpath:/config/)
classpath:/application.properties 或 application.yml
外部配置中心(如 nacos、spring cloud config)
2. 读取配置文件的方式汇总
spring boot 提供了多种读取配置文件的方式。
方式一:使用 @value 注解读取配置
这种方式适合读取单个简单配置项。可以用来注入配置文件中的值,也可以指定默认值,防止配置项缺失时抛出异常 。
配置文件:
app: name: order-v version: v1
示例代码:
@component public class appproperties { @value("${app.name:order}") private string name; @value("${app.version:v1.0.0}") private string version; public void print() { system.out.println("app name: " + name); system.out.println("app version: " + version); } }
:
后面就是默认值- 当配置文件中没有对应的值时,会使用默认值
- 如果配置项存在对应的值,默认值不生效
测试代码:
@restcontroller @requestmapping("/test") @allargsconstructor public class testcontroller { private final appproperties appproperties; @requestmapping("/print") public void print() { appproperties.print(); } }
✅ 优点:
简单直接,适用于读取单个变量
❌ 缺点:
不支持嵌套结构、不支持批量绑定、不利于维护
方式二:使用 @configurationproperties 自动绑定配置类(推荐)
适合绑定多个字段、嵌套结构、list、map等复杂配置。
配置文件:
app: name: order-v version: v1 servers: - http://dev-server:8080 - http://test-server:8081 - http://prod-server:8082 metadata: author: alice version: 1.0.2 website: https://emp.com modules: user: enabled: true path: /user admin: enabled: false path: /admin
配置类示例代码:
import lombok.data; import org.springframework.boot.context.properties.configurationproperties; import org.springframework.stereotype.component; import java.util.list; import java.util.map; @component @configurationproperties(prefix = "app") @data public class appproperties { private string name; // list 示例 private list<string> servers; // map<string, string> 示例 private map<string, string> metadata; // map<string, 自定义对象> 示例 private map<string, module> modules; @data public static class module { private boolean enabled; private string path; } public void print() { system.out.println("name: " + name); system.out.println("servers: " + servers); system.out.println("metadata: " + metadata); system.out.println("modules: " + modules); } }
使用示例:
import com.example.xiaoshitou.config.appconfigproperties; import com.example.xiaoshitou.config.appproperties; import lombok.allargsconstructor; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; @restcontroller @requestmapping("/test") @allargsconstructor public class testcontroller { private final appproperties appproperties; private final appconfigproperties appconfigproperties; @requestmapping("/print") public void print() { appproperties.print(); } @requestmapping("/printconfig") public void printconfig() { appconfigproperties.print(); } }
✅ 优点:
- 支持对象结构、嵌套对象、list、map
- 支持校验(配合 @validated)
- 强类型绑定,ide 支持友好
❌ 缺点:
需要额外的类定义
方式三:使用 environment 编程式读取配置
适合动态读取、条件判断场景。
示例代码:
import com.example.xiaoshitou.config.appconfigproperties; import com.example.xiaoshitou.config.appproperties; import com.example.xiaoshitou.config.smsconfig; import lombok.allargsconstructor; import org.springframework.core.env.environment; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; /*** * @title * @author shijiangyong * @date 2025/4/24 17:28 **/ @restcontroller @requestmapping("/test") @allargsconstructor public class testcontroller { private final appproperties appproperties; private final appconfigproperties appconfigproperties; private final environment env; @requestmapping("/print") public void print() { appproperties.print(); } @requestmapping("/printconfig") public void printconfig() { appconfigproperties.print(); } @requestmapping("/printenv") public void printenv() { string name = env.getproperty("app.name"); system.out.println("app.name = " + name); } }
✅ 优点:
- 动态、灵活,支持条件判断
- 可用于第三方库或工具类中
❌ 缺点:
可读性差,不支持自动绑定
方式四:加载自定义配置文件(@propertysource)
当你需要读取非 application.yml 的配置文件时使用。
自定义配置文件 sms-config.properties:
sms.sign=aliyun sms.template.code=tpl001
示例代码:
import lombok.data; import org.springframework.boot.context.properties.configurationproperties; import org.springframework.context.annotation.configuration; import org.springframework.context.annotation.propertysource; /*** * @title * @author shijiangyong * @date 2025/4/25 10:08 **/ @configuration @propertysource("classpath:sms-config.properties") @configurationproperties(prefix = "sms") @data public class smsconfig { private string sign; private template template; @data public static class template { private string code; } public void print() { system.out.println("sign : " + sign); system.out.println("template.code : " + template.getcode()); } }
使用示例:
import com.example.xiaoshitou.config.appconfigproperties; import com.example.xiaoshitou.config.appproperties; import com.example.xiaoshitou.config.smsconfig; import lombok.allargsconstructor; import org.springframework.core.env.environment; import org.springframework.web.bind.annotation.requestmapping; import org.springframework.web.bind.annotation.restcontroller; /*** * @title * @author shijiangyong * @date 2025/4/24 17:28 **/ @restcontroller @requestmapping("/test") @allargsconstructor public class testcontroller { private final appproperties appproperties; private final appconfigproperties appconfigproperties; private final smsconfig smsconfig; private final environment env; @requestmapping("/print") public void print() { appproperties.print(); } @requestmapping("/printconfig") public void printconfig() { appconfigproperties.print(); } @requestmapping("/printenv") public void printenv() { string name = env.getproperty("app.name"); system.out.println("app.name = " + name); } @requestmapping("/smsconfig") public void smsconfig() { smsconfig.print(); } }
✅ 优点:
- 支持加载自定义配置文件
- 可与 @configurationproperties 搭配使用
❌ 缺点:
- 不支持 .yml 格式
- 不支持动态刷新
方式五:多环境配置(多 profile)
适用于开发、测试、生产环境的配置隔离。
配置文件:
# application-dev.yml app: name: devapp # application-prod.yml app: name: prodapp
激活方式:
在 application.yml 中设置:
spring: profiles: active: dev
或通过启动参数:
--spring.profiles.active=prod
✅ 优点:
- 多环境隔离,配置清晰
- 支持组合激活多个 profile
总结
场景 | 推荐方式 |
---|---|
读取单个简单值 | @value |
读取嵌套结构、对象 | @configurationproperties |
动态读取 | environment |
非默认配置文件 | @propertysource |
多环境支持 | 多 profile |
以上就是spring boot读取配置文件的五种方式小结的详细内容,更多关于spring boot读取配置文件的资料请关注代码网其它相关文章!
发表评论