SpringBoot中配置文件详解(ymlproperties全局配置和自定义配置),获取配置方式

Posted peach桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot中配置文件详解(ymlproperties全局配置和自定义配置),获取配置方式相关的知识,希望对你有一定的参考价值。

目录

全局配置文件

application.properties配置文件

application.yaml配置文件

 value值为普通数据类型(例如数字、字符串、布尔等)

 value值为数组和单列集合

 value值为Map集合

 value值为对象或嵌套对象

@Value

自定义配置

使用@PropertySource加载配置文件

随机数设置及参数间引用

随机值设置

参数间引用


全局配置文件

全局配置文件是能够对一些默认配置值进行修改。Spring Boot使用一个application.properties或者application.yml的文件作为全局配置文件,该文件存放在src/main/resource目录或者类路径的/config,一般会选择resource目录。

   application.properties配置文件

server.port=8080
spring.config.name=peach
spring.application.name=peach-properties
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=xxxx
spring.redis.database=0

演示将application.properties配置文件中的自定义配置属性注入到PropertiesConfig实体类的对应属性中

package com.peach.demo.vo;

import lombok.Data;

/**
 * @program: YLT
 * @description: 人类
 * @author: Mr.peach
 * @create: 2023-04-02 23:46
 **/
@Data
public class People 

    private Integer id;
    private String name;
    private int age;

package com.peach.demo.config;

import com.peach.demo.vo.People;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * @program: YLT
 * @description: 配置类
 * @author: Mr.peach
 * @create: 2023-04-02 23:48
 **/
@ConfigurationProperties(prefix = "peach-pro")
@Component
@Data
public class PropertiesConfig 

    private Integer id;
    private String userName;
    private List liek;
    private String[] family;
    private Map map;
    private People people;


  • 在resources目录下创建的application.properties文件配置如下:

    

 编写application.properties配置文件时,由于要配置的PropertiesConfig对象属性是我们自定义的,Spring Boot无法自动识别,所以不会有任何书写提示。在实际开发中,为了出现代码提示的效果来方便配置,在使用@ConfigurationProperties注解进行配置文件属性值注入时,可以在pom.xml文件中添加一个SpringBoot提供的配置处理器依赖:

        <!--自定义配置提示-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>

重新运行项目启动类或者重新构建可生效

 测试配置效果

application.yaml配置文件

        YAML文件格式是Spring Boot支持的一种JSON超集文件格式,相较于传统的Properties配置文件,YAML文件以数据为核心,是一种更为直观且容易被电脑识别的数据序列化格式。application.yaml配置文件的工作原理和application.properties是一样的,只不过yaml格式配置文件看起来更简洁一些。我本人开发过程中一般用这种格式,更简洁更有层次感。 YAML文件的扩展名可以使用.yml或者.yaml。 application.yml文件使用“key:(空格)value"格式配置属性,使用缩进控制层级关系。

value值为普通数据类型(例如数字、字符串、布尔等)

 value值为数组和单列集合

        当YAML配置文件中配置的属性值为数组或单列集合类型时,主要有两种书写方式︰缩进式写法和行内式写法。缩进式有两种写法,行内式写法如下:

 value值为Map集合

 value值为对象或嵌套对象

注意:application.properties和application.yml如果配置相同属性,application.properties会覆盖application.yml的配置。 

@Value

支持基本属性的注入,对于包含Map集合、对象以及YAML文件格式的行内式写法的配置文件的属性注入都不支持,如果赋值会出现错误

自定义配置

可以说,几乎所有的配置都可以写在application.peroperties文件中,Spring Boot会自动加载全局配置文件从而免除我们手动加载的烦恼。但是,如果我们自定义配置文件,Spring Boot是无法识别这些配置文件的,此时就需要我们手动加载。

使用@PropertySource加载配置文件

对于这种加载自定义配置文件的需求,可以使用@PropertySource注解结合@Configuration注解配置类的方式来实现。@PropertySource注解用于指定自定义配置文件的具体位置和名称。同时,为了保证Spring Boot能够扫描该注解,还需要类上添加@Configuration注解将实体类作为自定义配置类。当然,如果需要将自定义配置文件中的属性值注入到对应类的属性中,可以使用@ConfigurationProperties或者@Value注解进行属性值注入

  • 打开Spring Boot项目的resources目录,在项目的类路径下新建一个peach.properties自定义配置文件,在该配置文件中编写需要设置的配置属性。

  • 新创建一个配置类CustomPropertiesConfig,提供zjq.properties自定义配置文件中对应的属性,并根据@PropertySource注解的使用进行相关配置

随机数设置及参数间引用

在Spring Boot配置文件中设置属性时,除了可以像前面示例中显示的配置属性值外,还可以使用随机值和参数间引用对属性值进行设置。下面,针对配置文件中这两种属性值的设置方式进行讲解。

随机值设置

在Spring Boot配置文件中,随机值设置使用到了Spring Boot内嵌的RandomValuePropertySource类,对一些隐秘属性值或者测试用例属性值进行随机值注入。 随机值设置的语法格式为$random.xx,xx表示需要指定生成的随机数类型和范围,它可以生成随机的整数、uuid或字符串,示例代码如下:

  # $random.value # 配置随机值
  # $random.int #配置随机整数
  # $random.long # 配置随机long类型数
  # $random.uuid # 配置随机uuid类型数
  # $random.int(10) #配置小于10的随机整数
  #$random.int[1024,65536] # 配置范围在[ 1024,65536]之间的随机整

参数间引用

  在Spring Boot配置文件中,配置文件的属性值还可以进行参数间的引用,也就是在后一个配置的属性值中直接引用先前已经定义过的属性,这样可以直接解析其中的属性值了。 使用参数间引用的好处就是,在多个具有相互关联的配置属性中,只需要对其中一处属性预先配置,其他地方都可以引用,省去了后续多处修改的麻烦 参数间引用的语法格式为$xx,xx表示先前在配置文件中已经配置过的属性名

 

SpringBoot学习配置文件详解

正如所说,SpringBoot使用“习惯优于配置”,即项目中存在大量配置,此外还内置了一个习惯性的配置,让你无需手动进行配置,这样,便让你的项目快速运行起来,而如何开启项目中的各个功能模块的默认配置,这就用到了SpringBoot的全局配置文件。

配置文件

在上一篇SpringBoot学习(一)第一个SpringBoot项目这篇文章中讲到,在创建SpringBoot项目的时候,核心配置文件为application.properties,实际上配置文件有两种格式:

  • application.properties
  • application.yml

而创建SpringBoot项目的时候,会默认的配置文件格式为.properties的,而这两种格式的文件有有何区别,举个例子:

application.properties

# port
server.port = 8081

application.yml

# port
server:
  port: 8082

在上面的例子可以看到,以自定义端口号为例,两种配置文件的结构都不同,application.yml文件的数据结构是树形的,并且properties文件是以.作为分隔符,yml文件是以:作为分隔符,这些便是这两个文件的区别,但是两者都可以作为SpringBoot配置文件,本文将对application.properties文件做个详细的介绍。

application.properties介绍

1)自定义属性

application.properties除了可以修改默认配置,还可以配置自定义属性,并在实体bean中加载出来。

application.properties

# port
server.port = 8081

# 自定义属性
com.userName = isKylin
com.userPassword = 123456

方式一:@Value

@RestController
@Slf4j
public class ConfigurationController {
    /**
     * 方式一,使用@Value注解
     */
    @Value("${com.userName}")
    private String userName;
    @Value("${com.userPassword}")
    private String userPassword;

    @RequestMapping("valueTest")
    public String valueTest() {
        log.info("@Value打印结果为:" + userName + "," + userPassword);
        return "success";
    }
}

运行结果:

技术图片

可以看到,控制台打印了配置文件中的自定义属性值。

方式二:@ConfigurationProperties

这是一种官方推荐的用法,通过该注解,绑定一个对象的bean,只需要在注解中指明前缀便可以读取自定义属性,避免了有时间属性太多,一个个绑定在属性字段上工作量会很大。

User.java

@Data
@Component
@ConfigurationProperties(prefix = "com")
public class User {
    private String userName;
    private String userPassword;
}

在没加@Component这个注解的时候,代码会提示错误,原因是只有使用这个注解,声明这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能。

UserController.java

    @Autowired
    User user;

    @RequestMapping("configurationPropertiesTest")
    public String configurationPropertiesTest() {
        log.info("@ConfigurationProperties打印结果为:" + user.getUserName() + "," + user.getUserPassword());
        return "success";
    }

技术图片

2)参数间引用

这部分将演示通过application.properties引用test.properties中的参数属性值

application.properties

# 参数间引用
com.quote = ${test.userName} , ${test.userPassword}

test.properties

# 被引用的参数属性值
test.userName = isKylin
test.userPassword = 123456

现在,两个配置文件的内容都写好了,这时候,只需要在实体类中添加@PropertySource注解,便可以将test.properties中的参数属性值引用到application.properties中:

User.java

@Data
@Component
//@ConfigurationProperties(prefix = "com")
@ConfigurationProperties(prefix = "test")
@PropertySource("classpath:test.properties")
public class User {
    private String userName;
    private String userPassword;
}

UserController.java

    /**
     * 参数间引用
     */
    @RequestMapping("quoteTest")
    public String quoteTest() {
        log.info("参数间引用打印结果为:" + user.getUserName() + "," + user.getUserPassword());
        return "success";
    }

运行结果:

技术图片

配置文件优先级说明

在SpringBoot项目中,配置文件优先级从大到小的排序为:

  1. target/config
  2. target
  3. classpath/config
  4. classpath

此外,如果你在相同优先级位置同时有application.properties和application.yml,那么application.yml里面的属性就会覆盖application.properties里的属性。

Profile多环境配置

在正常的开发中,会有多个环境,例如测试环境、开发环境、生成环境、联调环境等等,在每个环境下,可能配置的信息也会有所不同,因此就需要我们配置多环境配置文件。

技术图片

我们分别修改配置文件端口号,并且自定义不同属性,运行不同的配置文件看输出内容:

application-dev.properties

server.port = 8888
msg = this is application-dev.properties

application-test.properties

server.port = 8880
msg = this is application-test.properties

application-prod.properties

server.port = 8881
msg = this is application-prod.properties

application.properties

# port
server.port = 8081

# 自定义属性
com.userName = isKylin
com.userPassword = 123456

# 参数间引用
com.quote = ${test.userName} , ${test.userPassword}

# 多环境配置
spring.profiles.active = prod
msg = this is default

ProfilesController.java

@RestController
@Slf4j
public class ProfilesController {

    @Value("${msg}")
    private String msg;

    @RequestMapping("profilesTest")
    public String profilesTest() {
        log.info(msg);
        return msg;
    }
}

在默认的配置文件中,通过spring.profiles.active将配置文件设置成了application-prod.properties,在项目没其他任何报错的情况下,运行的端口会在8881,并且打印this is application-prod.properties,其他配置文件同理。

运行结果:

技术图片

以上是关于SpringBoot中配置文件详解(ymlproperties全局配置和自定义配置),获取配置方式的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 配置文件详解(告别XML)

SpringBoot配置文件application.properties详解

SpringBoot 使用: 配置文件详解

SpringBoot配置文件详解

SpringBoot配置详解

SpringBoot中配置文件详解(ymlproperties全局配置和自定义配置),获取配置方式