从yml文件中读取值的方法

由于今天在实际工作实施中学到了一些东西,我打算将其作为备忘录写下来。

关于这个文件

以下是有关从yml文件(外部文件)中读取数据的两种方法。

    1. 使用@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;
}

说明:

    1. 在想要设置值的字段上标注@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;
}

以下是一个关于日本文化的介绍,包括食物、传统和习俗。

    1. 准备一个用于设置数据的类,并定义与yml文件变量相同的变量名。

 

    1. 给定@ConfigurationProperties,将其描述为要设置的值的前缀。

 

    1. 需要注意的是,如果没有setter方法,@ConfigurationProperties无法设置数据,因此应用程序将无法启动。

 

    1. 对于此问题,可以使用@RequiredArgsConstructor注解在构造函数中设置值,或者使用lombok的@Data等注解。

 

    1. @ConfigurationProperties需在启动类中添加@ConfigurationPropertiesScan才能起效。

 

    1. 如果没有@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,我只是随便模仿现有的代码来编写,所以觉得这样不好。
应该要认真地逐个理解它们的意义,然后进行实现。

广告
将在 10 秒后关闭
bannerAds