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。

相关推荐
原野心存几秒前
java基础进阶知识点汇总(1)
java·开发语言
无理 Java32 分钟前
【技术详解】SpringMVC框架全面解析:从入门到精通(SpringMVC)
java·后端·spring·面试·mvc·框架·springmvc
gobeyye1 小时前
spring loC&DI 详解
java·spring·rpc
鱼跃鹰飞1 小时前
Leecode热题100-295.数据流中的中位数
java·服务器·开发语言·前端·算法·leetcode·面试
我是浮夸1 小时前
MyBatisPlus——学习笔记
java·spring boot·mybatis
TANGLONG2221 小时前
【C语言】数据在内存中的存储(万字解析)
java·c语言·c++·python·考研·面试·蓝桥杯
杨荧1 小时前
【JAVA开源】基于Vue和SpringBoot的水果购物网站
java·开发语言·vue.js·spring boot·spring cloud·开源
cyz1410012 小时前
vue3+vite@4+ts+elementplus创建项目详解
开发语言·后端·rust
liuxin334455662 小时前
大学生就业招聘:Spring Boot系统的高效实现
spring boot·后端·mfc
杨哥带你写代码2 小时前
构建高效新闻推荐系统:Spring Boot的力量
服务器·spring boot·php