SpringBoot配置文件、多环境配置、读取配置的4种实现方式

 更新时间:2024年09月23日 15:48:29   作者:夏诗曼CharmaineXia  
SpringBoot支持多种配置文件位置和格式,其中application.properties和application.yml是默认加载的文件,配置文件可以根据环境通过spring.profiles.active属性进行区分,命令行参数具有最高优先级,可覆盖其他所有配置

一、写配置文件的位置

springboot官方规定了四个写配置文件的位置,位置如下:

  • file指项目文件夹
  • classpath指打包后生成的的target文件夹

读取的优先级

优先级高会覆盖优先级低的相同配置,不同配置会互补。

1.文件位置:

如果这四个位置都有配置文件,会按照下图的优先级读取。

2.文件名和文件后缀:

Spring Boot默认会加载application.properties或application.yml文件,properties后缀的优先级更高。

application.properties > application.ym

3.配置文件中的profile-specific文件:

可以根据激活的profile,如dev、prod等,在配置文件名后使用-{profile}来命名,这些profile-specific的配置文件将覆盖通用的配置文件中的相同属性。

例如:

  • application-dev.properties  
  • application-prod.yml

4.命令行参数例如:application-dev.properties   application-prod.yml

最后,在启动jar包或war包时,可以指定参数值,命令行参数中指定的属性会覆盖之前加载的所有属性。

# 设置环境变量
ENV SPRING_NACOS_SERVERADDRESS='nacos.xxx.xxx:8848'
ENV SPRING_NACOS_NAMESPACE='merit-test'

# 启动jar包命令
java -Xms228m -Xmx228m -Dspring.cloud.nacos.config.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.config.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.config.username=merit -Dspring.cloud.nacos.config.password=merit -Dspring.cloud.nacos.discovery.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.discovery.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.discovery.username=merit -Dspring.cloud.nacos.discovery.password=merit -jar /home/admin/merit-backend/merit-appraise-*.jar

二、多环境配置

开发、测试、生产… ,多个环境下,如何指定不同环境的配置文件,使用spring.profiles.active属性

1. properties

2. yaml

三、yaml配置文件

yaml支持多种数据结构,还支持表达式,但是对格式要求严格

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

1.字符串(String):表示文本数据,可以使用单引号或双引号括起来。

name: ginjiang

# 如果字符串之中包含空格或特殊字符,需要放在引号之中
str: '内容: 字符串'

# 单引号之中如果还有单引号,必须连续使用两个单引号转义
str: 'labor''s day' 

# 多行字符串:允许在YAML中表示跨越多行的字符串,使用管道符(|)或大于符号(>)进行标识
description: |
  This is a multiline
  string in YAML.

2.数字(Number):表示数值数据,可以是整数或浮点数。

age: 25
pi: 3.14159

3.布尔值(Boolean):表示逻辑值,可以是true或false。

isStudent: true
hasCar: false

4.列表(List):表示有序的数据集合,使用短横线(-)作为标记,可以包含不同类型的数据。

pets:
  - cat
  - dog
  - pig
  
#行内写法  
pets: [cat,dog,pig]

5.字典(Dictionary)/映射(Mapping)/对象(Object):表示键值对的集合,使用冒号(:)分隔键和值。

student:
    name: qinjiang
    age: 3
 
#行内写法
student: {name:qinjiang,age:3}

6.字典和列表嵌套

employees:
  - name: John
    age: 25
  - name: Alice
    age: 30

7.空值(Null):表示空数据,使用null或~表示。

address: null

8.时间(Time):表示时间数据,使用ISO 8601格式表示。

timestamp: 2023-05-25T10:30:00Z

9.表达式

#自动生成uuid
name: ${random.uuid}

#自动生成随机数
name: ${random.int}

#占位符:student.name有值就用student.name的值,没有就用“小王”
name: ${student.name:小王}

10.特殊值(Special Values):YAML支持一些特殊的值,如无穷大(Infinity)、负无穷大(Negative Infinity)、非数字(NaN)等。

special_values:
  - infinity: .inf
  - negative_infinity: -.inf
  - not_a_number: .nan

11.引用(References):YAML允许使用引用来引用其他节点的值,使用&符号定义引用,使用*符号引用引用的值。

person: &ref
  name: John
  age: 25

employee:
  details: *ref

yaml、properties、xml对比

特点YAMLPropertiesXML
语法结构使用缩进和冒号(:)表示层级关系使用等号(=)或冒号(:)表示键值对使用标签和元素表示层级关系
数据类型支持多种数据类型,如字符串、数字、布尔值等键值对不直接支持数据类型,通过标签定义
可读性
扩展性支持扩展自定义数据类型和对象结构不支持支持自定义标签和元素结构
嵌套支持支持不支持支持
适用场景配置文件、数据序列化和交换格式简单配置文件和属性管理复杂数据交换和配置文件

四、读取配置文件

1. @ConfigurationProperties(prefix=“key”)

  

配置文件的值自动注入到实体中。  

通过在类上使用@ConfigurationProperties注解,并指定前缀,可以将配置文件中以该前缀开头的属性值绑定到对应的类的属性上。

2. @Value(“${key}”)

给每个属性单独赋值。

@Configuration
public class Student{
    @Value("${person.name}")
    private String name;
}

3. Environment对象

通过注入Environment对象,使用getProperty方法获取配置文件中的属性值。

@Component
public class MyComponent {
    @Autowired
    private Environment environment;

    public void someMethod() {
        String name = environment.getProperty("person.name");
    }
}

4. @PropertySource(value=“classpath:配置文件名”)

  

指定加载配置文件。  

使用@Configuration注解和@PropertySource注解:在配置类上使用@Configuration注解,并使用@PropertySource注解指定配置文件的位置。接着使用@Value注解或Environment对象来获取属性值。

@Configuration
@PropertySource("classpath:my.properties")
public class Student{
    @Value("${person.name}")
    private String name;
}

五、JSR303—参数验证

@Validated 是 Spring Framework 中的一个注解,它用于在方法参数、方法返回值或类级别上启用方法参数验证(Method Parameter Validation)。

它基于 JSR-303(Bean Validation)规范,提供了一种方便的方式来对方法参数进行验证。

常用的验证注解

  • @NotNull:验证参数值不为 null。
  • @NotBlank:验证字符串参数不为空(不为 null、不为空字符串、不包含空格)。
  • @NotEmpty:验证集合或数组参数不为空。
  • @Min(value):验证数字参数的最小值。
  • @Max(value):验证数字参数的最大值。
  • @Size(min, max):验证字符串、集合或数组参数的长度或大小是否在指定范围内。
  • @Pattern(regex):验证字符串参数是否匹配指定的正则表达式。
  • @Email:验证字符串参数是否为有效的电子邮件地址。
  • @Valid:递归验证嵌套对象或集合的元素。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis-Plus可能导致死锁的问题分析及解决办法

    Mybatis-Plus可能导致死锁的问题分析及解决办法

    这篇文章给大家主要介绍了Mybatis-Plus可能导致死锁的问题分析及解决办法,文中通过代码示例给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-12-12
  • JAVA实现JSON后端向前端传递数据

    JAVA实现JSON后端向前端传递数据

    本篇文章主要介绍了JAVA实现JSON后端向前端传递数据,这里整理了详细的代码,具有一定的参考价值,有需要的小伙伴可以参考下。
    2017-03-03
  • SpringBoot自定义注解的5个实战案例分享

    SpringBoot自定义注解的5个实战案例分享

    自定义注解是一种强大的元编程工具,允许在不修改原有代码逻辑的情况下,为程序添加额外的功能,本文将分析5个常见的案例,希望对大家有所帮助
    2025-09-09
  • Java中this关键字的4种用法详解(附常见面试题)

    Java中this关键字的4种用法详解(附常见面试题)

    在Java的编程世界里,this关键字宛如一把神奇的钥匙,看似简单,却蕴含着强大的功能,这篇文章主要介绍了Java中this关键字的4种用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-06-06
  • mybatis模糊查询like语句该如何写

    mybatis模糊查询like语句该如何写

    MyBatis模糊查询通常使用LIKE关键字,结合concat函数拼接通配符%实现,在MyBatis配置文件中,通过#{keyword}传递参数,生成带有通配符的查询语句,MyBatis-Plus中,通过LambdaQueryWrapper类和like方法构建模糊查询条件,简化查询操作
    2024-09-09
  • MyBatis-Plus UpdateWrapper 使用常见陷阱和解决方案

    MyBatis-Plus UpdateWrapper 使用常见陷阱和解决方案

    MyBatis-Plus是Mybatis的一个增强,简化了Mybatis的开发过程,不仅保持了Mybatis原有的功能,而且在无代码侵略下增加了许多的增强的功能,提供了丰富的CRUD操作,单表的CRUD操作无需编写SQL语句,本文介绍的是UpdateWrapper的常见陷阱和对应的解决方案,感兴趣的朋友一起看看吧
    2024-08-08
  • Spring SseEmitter推送消息及常用方法

    Spring SseEmitter推送消息及常用方法

    SseEmitter 是 Spring Framework 提供的用于支持 Server-Sent Events(SSE)的类,它允许服务器端向客户端推送事件流,实现服务器到客户端的单向通信,这篇文章主要介绍了Spring SseEmitter推送消息,需要的朋友可以参考下
    2024-07-07
  • Java使用PostgreSQL存储检索节气与季节的相关数据

    Java使用PostgreSQL存储检索节气与季节的相关数据

    这篇文章主要介绍了Java使用PostgreSQL存储检索节气与季节的相关数据,在众多检索领域中,对自然现象的检索,如节气与季节的检索,虽然看似简单,却蕴含着丰富的文化内涵和实用价值,需要的朋友可以参考下
    2025-10-10
  • Spring Boot利用Java Mail实现邮件发送

    Spring Boot利用Java Mail实现邮件发送

    这篇文章主要为大家详细介绍了Spring Boot利用Java Mail实现邮件发送,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • Java日常练习题,每天进步一点点(62)

    Java日常练习题,每天进步一点点(62)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-08-08

最新评论