SpringBoot-读取配置文件的几种方法

本文是关于Spring Boot框架下读取配置文件的指南。该指南介绍了如何通过注解和属性文件来加载和访问应用程序的配置信息。Spring Boot提供了简单而强大的功能,可以轻松地加载各种类型的配置文件,并将其映射到Java对象中。

一、映射法读取配置文件

我们先介绍Spring Boot框架下使用映射类法读取配置文件的过程。该方法通过使用@ConfigurationProperties注解,或者使用@Value注解从配置文件中读取属性值。

操作流程如下:

1、配置springboot配置处理器

a)pom.xml里添加依赖

在pom.xml文件中添加 spring-boot-configuration-processor 依赖。

XML 复制代码
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
</dependency>

b)maven重新构建

点击 pom.xml 文件中悬浮的 "M" 图标(Maven刷新的按钮),或者 Maven 菜单里右键生命周期下的compile(编译)运行 Maven 构建,Maven 会帮我们自动下载 springboot 配置处理器的包并安装到项目。


2、编写yml配置信息

application.ymlapplication-dev.yml 是与Spring Boot应用程序配置相关的文件。Spring Boot是一个用于构建Java应用程序的框架,它采用了约定优于配置的理念,并提供了默认配置,同时也支持通过配置文件进行定制。

a)application.yml

  • 这是主配置文件,包含了应用程序的默认配置。
  • 通常用于存放通用的配置项,适用于所有环境(如开发、测试和生产环境)。
  • 如果没有指定特定环境的配置文件,应用程序将使用application.yml中的配置。

我的配置信息如下:

XML 复制代码
spring:
  profiles:
    active: dev
 
  thymeleaf:
    view-names: /*
    cache: false
    prefix: /WEB-INF/html

b)application-dev.yml

  • 这是特定于开发环境的配置文件。
  • 当应用程序在开发环境中运行时,Spring Boot会自动加载这个文件,覆盖application.yml中的相应配置项。
  • 这允许你在不同的环境中使用不同的配置,以适应各个阶段的开发和测试需求。

我的配置信息如下:

XML 复制代码
server:
  port: 8080
 
spring:
  datasource:
    #替换成MySQL账户
    username: root
    #替换成MySQL密码
    password: root
    #替换成数据库名
    url: jdbc:mysql://localhost:3306/db_monitor?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.jdbc.Driver
 
  application:
    ## 注册服务名
    name: MonitorSystem
 
 
mybatis:
  mapper-locations: classpath:mappers/*Mapper.xml
  type-aliases-package: com.entity
 
logging:
  level:
    com:
      example:
        mapper: debug

3、使用注解读取配置

使用注解读取配置有两种方法,两种方法都是通过在实体类中通过配置注解,完成配置文件的字段和实体类属性的绑定。

a)使用@ConfigurationProperties注解

创建实体类DatabaseConfig。

DatabaseConfig的属性和想要获取的配置属性一一对应;

@ConfigurationProperties(prefix = "spring.datasource")注解写在类名前,其中spring.datasource是yml文件里所需属性的位置;

DatabaseConfig.java

java 复制代码
package com.entity;
 
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class DatabaseConfig {
    private String url;
    private String username;
    private String password;
}

b)使用@Value注解

创建实体类DatabaseConfigTest

DatabaseConfigTest的属性和想要获取的配置属性一一对应;

@Value("${spring.datasource.username}")注解写在每个属性前,其中spring.datasource.username是实体类属性对应的yml文件里的属性;

DatabaseConfigTest.java

java 复制代码
package com.entity;
 
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
@Getter
@Setter
@Component
public class DatabaseConfigTest {
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
}

4、测试注解配置是否生效

我们编写测试代码,运行测试。

java 复制代码
@Test
 void testConfigActive() {
     String url = databaseConfig.getUrl();
     String username = databaseConfig.getUsername();
     String password = databaseConfig.getPassword();
 
     System.out.println("url: " + url);
     System.out.println("username: " + username);
     System.out.println("password: " + password);
 
     url = databaseConfigTest.getUrl();
     username = databaseConfigTest.getUsername();
     password = databaseConfigTest.getPassword();
 
     System.out.println("url: " + url);
     System.out.println("username: " + username);
     System.out.println("password: " + password);
 }

右键运行。

我们看到控制台输出的测试结果,两个方法都可以获得到配置文件里参数的值。


二、工具类法读取配置文件

下面是Spring Boot框架下使用工具类法读取配置文件的过程。该指南介绍了如何通过引入SnakeYaml包建立YamlUtil工具类,直接获取应用程序的yaml配置文件的配置信息。这种方法相对于使用@Value对象映射的方法,更加方便,封装性更好。

1、创建YamlUtil工具类

YamlUtil.java

java 复制代码
package com.util;
 
import org.apache.log4j.Logger;
import org.yaml.snakeyaml.Yaml;
 
import java.io.InputStream;
import java.util.Map;
 
public class YamlUtil {
    private static final Logger log = Logger.getLogger(YamlUtil.class);
    private static final String YAML_FILE_PATH = "application-dev.yml";
    private static Map<String, Object> yamlData;
     
    static {
        loadYamlData();
    }
 
    private static void loadYamlData() {
        Yaml yaml = new Yaml();
        try (InputStream inputStream = YamlUtil.class.getClassLoader().getResourceAsStream(YAML_FILE_PATH)) {
            yamlData = yaml.load(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public static String getString(String key) {
        Object value = getProperty(key);
        if (value != null) {
            return value.toString();
        }
        return null;
    }
 
    private static Object getProperty(String key) {
        String[] keys = key.split("\\.");
        Object value = yamlData;
        for (String k : keys) {
            if (value instanceof Map) {
                value = ((Map<?, ?>) value).get(k);
            } else {
                return null;
            }
        }
        return value;
    }
}

2、编写配置信息

同理,application.ymlapplication-dev.yml 作为我们Spring Boot应用程序的配置文件。

a)application.yml

我的配置信息如下:

XML 复制代码
spring:
  profiles:
    active: dev
 
  thymeleaf:
    view-names: /*
    cache: false
    prefix: /WEB-INF/html

b)application-dev.yml

我的配置信息如下:

XML 复制代码
server:
  port: 8080
 
spring:
  datasource:
    #替换成MySQL账户
    username: root
    #替换成MySQL密码
    password: root
    #替换成数据库名
    url: jdbc:mysql://localhost:3306/db_monitor?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.jdbc.Driver
 
  application:
    ## 注册服务名
    name: MonitorSystem
 
 
mybatis:
  mapper-locations: classpath:mappers/*Mapper.xml
  type-aliases-package: com.entity
 
logging:
  level:
    com:
      example:
        mapper: debug
 
output:
  file_path: output

3、使用工具类读取配置

调用代码代码如下:

java 复制代码
String xxx = YamlUtil.getString("xxx");

后面我们需要去读取配置文件中的内容,只需要通过YamlUtil工具类的getString方法即可。


4、测试工具类读取有效

我们编写测试代码,运行测试。

java 复制代码
@Test
 void testConfigActive2() {
     String path = YamlUtil.getString("output.file_path");
     System.out.println("path: " + path);
 }

可以看到我们配置中的 path 被正确输出。我们可以在控制台输出检查读取结果,这里读取的结果是output。

相关推荐
向宇it5 分钟前
【从零开始入门unity游戏开发之——C#篇24】C#面向对象继承——万物之父(object)、装箱和拆箱、sealed 密封类
java·开发语言·unity·c#·游戏引擎
小蜗牛慢慢爬行7 分钟前
Hibernate、JPA、Spring DATA JPA、Hibernate 代理和架构
java·架构·hibernate
星河梦瑾1 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
黄名富1 小时前
Redis 附加功能(二)— 自动过期、流水线与事务及Lua脚本
java·数据库·redis·lua
love静思冥想1 小时前
JMeter 使用详解
java·jmeter
言、雲1 小时前
从tryLock()源码来出发,解析Redisson的重试机制和看门狗机制
java·开发语言·数据库
TT哇1 小时前
【数据结构练习题】链表与LinkedList
java·数据结构·链表
机器之心1 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端
Yvemil72 小时前
《开启微服务之旅:Spring Boot 从入门到实践》(三)
java
Anna。。2 小时前
Java入门2-idea 第五章:IO流(java.io包中)
java·开发语言·intellij-idea