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

总结

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

相关文章

  • 在Action中以Struts2的方式输出JSON数据的实例

    在Action中以Struts2的方式输出JSON数据的实例

    下面小编就为大家带来一篇在Action中以Struts2的方式输出JSON数据的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • java实现ATM取款项目

    java实现ATM取款项目

    这篇文章主要为大家详细介绍了java实现ATM取款项目的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Java中String类使用方法总结

    Java中String类使用方法总结

    这篇文章主要介绍了Java中String类的使用方法,文章简单易懂,结尾有实例代码帮助大家理解学习,感兴趣的朋友可以了解下
    2020-06-06
  • 详解Spring Boot Junit单元测试

    详解Spring Boot Junit单元测试

    本篇文章主要介绍了详解Spring Boot Junit单元测试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 使用Idea简单快速搭建springcloud项目的图文教程

    使用Idea简单快速搭建springcloud项目的图文教程

    这篇文章主要介绍了使用Idea简单快速搭建springcloud项目,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Gradle进阶使用结合Sonarqube进行代码审查的方法

    Gradle进阶使用结合Sonarqube进行代码审查的方法

    今天小编就为大家分享一篇关于Gradle进阶使用结合Sonarqube进行代码审查的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • springboot+idea+maven 多模块项目搭建的详细过程(连接数据库进行测试)

    springboot+idea+maven 多模块项目搭建的详细过程(连接数据库进行测试)

    这篇文章主要介绍了springboot+idea+maven 多模块项目搭建的详细过程(连接数据库进行测试),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Mybatis中拦截器的使用场景和技巧分享

    Mybatis中拦截器的使用场景和技巧分享

    Mybatis提供了一些机制,可以允许我们在做数据库操作的时候进行我们额外的一些程序,当然,这看起来并没有JPA的EntityListener好用,本文小编将给大家详细的介绍了Mybatis中拦截器的使用场景和技巧,需要的朋友可以参考下
    2023-10-10
  • Spring循环依赖的处理方法

    Spring循环依赖的处理方法

    循环依赖是指两个或多个组件之间相互依赖,形成一个闭环,从而导致这些组件无法正确地被初始化或加载,这篇文章主要介绍了Spring循环依赖的处理,需要的朋友可以参考下
    2023-08-08
  • 基于SpringBoot集成测试远程连接Redis服务的教程详解

    基于SpringBoot集成测试远程连接Redis服务的教程详解

    这篇文章主要介绍了基于SpringBoot集成测试远程连接的Redis服务的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论