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:递归验证嵌套对象或集合的元素。

总结

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

相关文章

  • Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException

    Java xml出现错误 javax.xml.transform.TransformerException: java.

    这篇文章主要介绍了Java xml出现错误 javax.xml.transform.TransformerException: java.lang.NullPointerException的相关资料,需要的朋友可以参考下
    2016-11-11
  • Spring Boot整合RabbitMQ实例(Topic模式)

    Spring Boot整合RabbitMQ实例(Topic模式)

    Topic Exchange 转发消息主要是根据通配符。接下来通过本文给大家分享Spring Boot整合RabbitMQ实例(Topic模式),需要的朋友参考下吧
    2017-04-04
  • Java 实战范例之线上婚纱摄影预定系统的实现

    Java 实战范例之线上婚纱摄影预定系统的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+javaweb+SSM+springboot+mysql实现一个线上婚纱摄影预定系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • 详解Java实现缓存(LRU,FIFO)

    详解Java实现缓存(LRU,FIFO)

    本篇文章主要介绍了详解Java实现缓存(LRU,FIFO) ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 解决新版idea新建文件没有XML和Resource Bundle文件问题

    解决新版idea新建文件没有XML和Resource Bundle文件问题

    这篇文章主要介绍了解决新版idea新建文件没有XML和Resource Bundle文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • java jvm两种存储区的类型知识点讲解

    java jvm两种存储区的类型知识点讲解

    在本篇文章里小编给大家整理的是一篇关于java jvm两种存储区的类型知识点讲解内容,有兴趣的朋友们可以学习下。
    2021-03-03
  • Java如何正确的使用wait-notify方法你知道吗

    Java如何正确的使用wait-notify方法你知道吗

    这篇文章主要为大家详细介绍了Java如何正确的使用wait-notify方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java经典面试题汇总:异常

    Java经典面试题汇总:异常

    本篇总结的是Java异常相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢
    2021-07-07
  • obix协议在java中的配置和使用详解

    obix协议在java中的配置和使用详解

    这篇文章主要给大家介绍了关于obix协议在java中的配置和使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-08-08
  • 多模块项目使用枚举配置spring-cache缓存方案详解

    多模块项目使用枚举配置spring-cache缓存方案详解

    这篇文章主要为大家介绍了多模块项目使用枚举配置spring-cache缓存的方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论