从yml文件中读取值的方法
由于今天在实际工作实施中学到了一些东西,我打算将其作为备忘录写下来。
关于这个文件
以下是有关从yml文件(外部文件)中读取数据的两种方法。
-
- 使用@Value的读取方法
使用@ConfigurationProperties的读取方法
执行环境
・Java17 :Java的第17个版本
・SpringBoot 3.0.2 :SpringBoot的3.0.2版本
build.gradle文件的配置如下
plugins {
id 'java'
id 'org.springframework.boot' version '3.0.2'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-mail'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
实施
将以下设置添加到application.yml文件中(用于发送电子邮件)。
spring:
mail:
host: smtp.gmail.com
port: 587
username: dummy
password: dummy
1. 使用@Value进行读取的方法
如果想要单独获取yaml文件的值,我认为可以使用@Value。
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
@Getter
public class MailConfigValue {
@Value("${spring.mail.port}")
private int port;
}
说明:
-
- 在想要设置值的字段上标注@Value,将要设置的yml文件的值的变量名层级用”.”连接起来写出来。
@Component会在应用程序启动时将该类注册到DI容器中,通过依赖注入可以提取出port的值。
使用@Getter标注以便提取,通过getPort()就可以了。
以下是一个例子。
@Service
@RequiredArgsConstructor
@Slf4j
public class MailSenderService {
private final MailConfigValue mailConfigValue;
public void smtpMailSender() {
log.info(String.valueOf(mailConfigValue.getPort()));
return true;
}
}
2. 使用@ConfigurationProperties的加载方法
若要一次获取多个值,请使用@ConfigurationProperties。
package com.example.demo.config;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
@RequiredArgsConstructor
@Getter
@ConfigurationProperties(prefix="spring.mail")
public class MailConfig {
private final String host;
private final int port;
private final String userName;
private final String password;
}
以下是一个关于日本文化的介绍,包括食物、传统和习俗。
-
- 准备一个用于设置数据的类,并定义与yml文件变量相同的变量名。
-
- 给定@ConfigurationProperties,将其描述为要设置的值的前缀。
-
- 需要注意的是,如果没有setter方法,@ConfigurationProperties无法设置数据,因此应用程序将无法启动。
-
- 对于此问题,可以使用@RequiredArgsConstructor注解在构造函数中设置值,或者使用lombok的@Data等注解。
-
- @ConfigurationProperties需在启动类中添加@ConfigurationPropertiesScan才能起效。
-
- 如果没有@ConfigurationPropertiesScan,将无法读取@ConfigurationProperties,导致应用程序无法启动。
- @ConfigurationPropertiesScan会将其注册到DI容器中,使得可以通过依赖注入来使用yml文件的值。
将启动类中的@ConfigurationPropertiesScan设置如下。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
@ConfigurationPropertiesScan
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
总结
可能不太需要使用@Value。
如果是需要多个值的情况,我觉得可以使用@ConfigurationProperties。
没有意识到需要使用 setter,我只是随便模仿现有的代码来编写,所以觉得这样不好。
应该要认真地逐个理解它们的意义,然后进行实现。