SpringBoot 优雅加载 yaml 属性的方法

SpringBoot 优雅加载 yaml 属性的方法

一共有三种

1. 第一种非常简单

1)在edu.tyut.bean包下写如下内容
EmailUser.kt

@Component
@ConsistentCopyVisibility
internal data class EmailUser internal constructor(
    @Value(value = "\${email.user}")
    internal val user: String,
    @Value(value = "\${email.email}")
    internal val email: String
)

2)在application.yml添加如下内容:

email:
  user: zsh
  email: 2905154639@qq.com

2. 第二种需要在启动类配置

1)在edu.tyut.bean包下写如下内容
EmailUser.kt

@ConfigurationProperties(prefix = "email")
@ConsistentCopyVisibility
internal data class EmailUser internal constructor(
    internal val user: String,
    internal val email: String
)

2)在启动类配置如下内容

package edu.tyut

import edu.tyut.bean.EmailUser
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.runApplication

@SpringBootApplication
@EnableConfigurationProperties(value = [EmailUser::class]) // <-
private class Application

internal fun main(args: Array<String>) {
    runApplication<Application>(*args)
}

3)在application.yml添加如下内容:

email:
  user: zsh
  email: 2905154639@qq.com

3. 第三种较为复杂

1)在edu.tyut.bean包下写如下内容
EmailUser.kt

@ConfigurationProperties(prefix = "email")
@ConsistentCopyVisibility
internal data class EmailUser internal constructor(
    internal val user: String,
    internal val email: String
)

2)在启动类配置如下内容

package edu.tyut

import edu.tyut.bean.EmailUser
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.runApplication

@SpringBootApplication
@EnableConfigurationProperties(value = [EmailUser::class]) // <-
private class Application

internal fun main(args: Array<String>) {
    runApplication<Application>(*args)
}

3)在email-config.yml添加如下内容:

email:
  user: zsh
  email: 2905154639@qq.com

4)在edu.tyut.processor包下新建如下:
EmailEnvironmentPostProcessor.kt

package edu.tyut.processor

import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean
import org.springframework.boot.SpringApplication
import org.springframework.boot.env.EnvironmentPostProcessor
import org.springframework.core.env.ConfigurableEnvironment
import org.springframework.core.env.PropertiesPropertySource
import org.springframework.core.io.ClassPathResource
import java.util.Properties

internal class EmailEnvironmentPostProcessor : EnvironmentPostProcessor {

    private val logger: Logger = LoggerFactory.getLogger(this.javaClass)

    override fun postProcessEnvironment(
        environment: ConfigurableEnvironment?,
        application: SpringApplication?
    ) {
        println("postProcessEnvironment...")
        logger.info("EmailEnvironmentPostProcessEnvironment")
        val resource = ClassPathResource("email-config.yml")
        val factory = YamlPropertiesFactoryBean()
        factory.setResources(resource)
        factory.afterPropertiesSet()
        factory.`object`?.let { properties: Properties ->
            logger.info("properties: ${properties.propertyNames().toList()}")
            val propertySource = PropertiesPropertySource("emailConfig", properties)
            environment?.propertySources?.addLast(propertySource)
        }
    }
}

5)resources/META-INF/spring.factories文件下注册:

org.springframework.boot.env.EnvironmentPostProcessor=\
edu.tyut.processor.EmailEnvironmentPostProcessor

推荐第一种方式,非常简单

posted @ 2025-06-07 00:30  爱情丶眨眼而去  阅读(22)  评论(0)    收藏  举报