本文是关于Spring Boot框架下读取配置文件的指南。该指南介绍了如何通过注解和属性文件来加载和访问应用程序的配置信息。Spring Boot提供了简单而强大的功能,可以轻松地加载各种类型的配置文件,并将其映射到Java对象中。
我们先介绍Spring Boot框架下使用映射类法读取配置文件的过程。该方法通过使用@ConfigurationProperties注解,或者使用@Value注解从配置文件中读取属性值。
操作流程如下:
在pom.xml文件中添加 spring-boot-configuration-processor 依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
点击? pom.xml 文件中悬浮的 "M" 图标(Maven刷新的按钮),或者 Maven 菜单里右键生命周期下的compile(编译)运行 Maven 构建,Maven 会帮我们自动下载 springboot 配置处理器的包并安装到项目。
application.yml
和 application-dev.yml
是与Spring Boot应用程序配置相关的文件。Spring Boot是一个用于构建Java应用程序的框架,它采用了约定优于配置的理念,并提供了默认配置,同时也支持通过配置文件进行定制。
application.yml
中的配置。我的配置信息如下:?
spring:
profiles:
active: dev
thymeleaf:
view-names: /*
cache: false
prefix: /WEB-INF/html
application.yml
中的相应配置项。我的配置信息如下:??
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
使用注解读取配置有两种方法,两种方法都是通过在实体类中通过配置注解,完成配置文件的字段和实体类属性的绑定。
创建实体类DatabaseConfig。
DatabaseConfig的属性和想要获取的配置属性一一对应;
@ConfigurationProperties(prefix = “spring.datasource”)注解写在类名前,其中spring.datasource是yml文件里所需属性的位置;
DatabaseConfig.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;
}
创建实体类DatabaseConfigTest
DatabaseConfigTest的属性和想要获取的配置属性一一对应;
@Value(“${spring.datasource.username}”)注解写在每个属性前,其中spring.datasource.username是实体类属性对应的yml文件里的属性;
DatabaseConfigTest.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;
}
我们编写测试代码,运行测试。
@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对象映射的方法,更加方便,封装性更好。
YamlUtil.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;
}
}
同理,application.yml
和 application-dev.yml
作为我们Spring Boot应用程序的配置文件。
我的配置信息如下:
spring:
profiles:
active: dev
thymeleaf:
view-names: /*
cache: false
prefix: /WEB-INF/html
我的配置信息如下:
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
调用代码代码如下:
String xxx = YamlUtil.getString("xxx");
后面我们需要去读取配置文件中的内容,只需要通过YamlUtil工具类的getString方法即可。
我们编写测试代码,运行测试。
@Test
void testConfigActive2() {
String path = YamlUtil.getString("output.file_path");
System.out.println("path: " + path);
}
可以看到我们配置中的 path?被正确输出。我们可以在控制台输出检查读取结果,这里读取的结果是output。