Sping Boot入门到实战之入门篇(三):Spring Boot属性配置
该篇为Sping Boot入门到实战系列入门篇的第三篇。介绍Spring Boot的属性配置。
传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文件名自定义),然后在xml配置中通过
1 | <util:properties id= "demoProps" location= "classpath:demo.properties" /> |
引入属性文件。再定义一个Bean来读取这些属性,Bean配置:
1 2 3 4 5 6 7 8 | <bean class = "org.springframework.beans.factory.config.MethodInvokingFactoryBean" > <property name= "staticMethod" value= "包名.DemoUtil.init" /> <property name= "arguments" > <list> <ref bean= "demoProps" /> </list> </property> </bean> |
Bean定义:
1 2 3 4 5 6 7 8 9 | public class DemoUtil { private static Properties properties; static void init(Properties props) { properties = props; } public static String getValue(String key){ return properties.getProperty(key); } } |
在其它地方通过DemoUtil.getValue()方法来访问具体某个属性的值。
Spring Boot中,可以在多个地方配置属性,包括properties文件,yaml文件,环境变量, 系统属性,命令行参数等, 这些属性都会被Spring Boot加到Environment中,可通过@Value注解,Environment 实例,或 @ConfigurationProperties注解的类来访问。
属性加载优先级顺序:
- 如果有使用devtools,devtools 全局设置的属性(用户目录 ~/.spring-bootdevtools.properties)
- 测试类的注解@TestPropertySource
- 测试类属性注解 @SpringBootTest#properties
- 命令行参数
- SPRING_APPLICATION_JSON里的属性(环境变量或系统属性)
- ServletConfig初始化参数
- ServletContext初始化参数
- JNDI参数 java:comp/env
- Java系统属性 System.getProperties()
- 操作系统环境变量
- RandomValuePropertySource 配置的属性 random.*
- jar包外部的applictaion-{profile}.properties,applictaion-{profile}.yml配置文件
- jar包内部的applictaion-{profile}.properties,applictaion-{profile}.yml配置文件
- jar包外部的applictaion.properties,applictaion.yml配置文件
- jar包内部的applictaion.properties,applictaion.yml配置文件
- @Configuration类上的 @PropertySource注解指定的配置文件
- 默认属性: SpringApplication.setDefaultProperties
上述属性配置,除了红色标注的外,其它一般应用较少。序号低的配置优先级高于序号高的配置,即如果存在相同属性配置 ,则序号低的配置会覆盖序号高的配置。
配置属性
1. 命令行参数
启动Spring Boot应用时,可以指定命令行参数,如:
1 | java -jar springboot-demo-properties.jar --my.name=command_line_devlink |
该参数值将会覆盖应用其它地方的同名属性配置值。命令行参数放在xx.jar 的后面。
可以通过SpringApplication.setAddCommandLineProperties(false) 禁用命令行参数配置
2. Java系统属性
同样在启动Spring Boot应用时,可以指定Java系统属性,如:
1 | java -Dmy.name=system_properties_devlink -jar springboot-demo-properties.jar |
Java系统属性放在java命令之后。
3. 操作系统环境变量
配置过JAVA_HOME的应该理解何为环境变量。某些操作系统可能不支持.分隔的属性名,可以改为以下划线连接。Spring Boot将myName, my.name, MY_NAME视为等效。
4. 应用属性配置文件(.properties文件或 .yml文件)
.properties文件属性配置格式:
1 2 3 | my.name=devlink my.list[ 0 ]=aaa //配置列表 my.list[ 1 ]=bbb |
.yml文件属性配置格式:
1 2 3 4 5 | my: name: devlink list: //配置列表 - aaa - bbb |
yml中,属性名与值之间冒号后面必须有空格。
应用属性配置文件位置:
- jar包所在当前目录下的子目录/config
- jar包所在当前目录
- classpath根目录下的子目录/config
- classpath根目录
序号低的优先级高于序号高的优先级,即jar包外的配置优先级高于jar包内的配置。同一目录下,.properties文件的优先级高于.yml文件。application-{profile}.properties的优先级高于application.properties。
访问属性
1. 类中属性上添加 @Value("${xx}") 注解方式。如:
1 2 | @Value ( "${my.name}" ) private String myName; |
可以指定默认值,如 @Value("${my.gender:f}"), 当my.gender未配置时,默认使用值"f"
2. 通过@ConfigurationProperties注解的类来访问。如定义:
1 2 3 4 5 6 | @Configuration @ConfigurationProperties (prefix = "my" ) public class MyConfig { private String name; getter/setter; } |
然后在需要访问的Bean中,通过@Autowired 注入MyConfig实例,通过getName()方法即可访问my.name属性值。
3. 通过Environment 实例访问。如:
1 2 | @Autowired private Environment env; |
然后调用env.getProperty("my.name")访问。
分类:
SpringBoot1系列
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?