在Spring Boot 2.2系列中使用@ConfigurationProperties

在Spring Boot 2.2.0的发布中,Spring Boot 2.2.x版本中的@ConfigurationProperties的使用变得更加方便,现在来介绍一下。

更新日志

2019年11月7日
我添加了对Spring Boot 2.2.1的更改的补充。同时,我也进行了一些文言修订。

太长不看。

    • @ConstructorBindingを付与することで、@ConfigurationPropertiesが付与されたクラスにセッターを定義せずに済むようになった(Kotlinの場合lateinit varを使わずにコンストラクタにプロパティを定義できるようになった)

 

    • @EnableConfigurationPropertiesや@Componentを使わずに、@ConfigurationPropertiesが付与されたクラスをスキャンできるようになった

 

    • 2019.11.07 追記:

 

    • Spring Boot 2.2.1で@ConfigurationPropertiesがデフォルトでスキャンされなくなる修正が入りました。

 

    • https://github.com/spring-projects/spring-boot/issues/18674

 

    Spring Boot 2.2.0で@EnableConfigurationPropertiesや@Componentを使わずに@ConfigurationPropertiesを利用しているアプリケーションを2.2.1に更新する場合は修正が必要です。修正方法は後述します。

假设

请使用Kotlin在Spring Boot 2.1系列和2.2系列中实现一个示例代码,该代码输出以下设置文件中的信息。

sample.foo=FOO
sample.bar=BAR

如果是Spring Boot 2.1版本的情况下

环境:Spring Boot 2.1.10.BUILD-SNAPSHOT的版本。

package com.dais39.springboot21kt

import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.runApplication
import org.springframework.stereotype.Component

@SpringBootApplication
// @EnableConfigurationProperties(SampleConfig::class)
class Spring21KtApplication

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

@Component //@EnableConfigurationPropertiesを使う場合は不要
@ConfigurationProperties(prefix = "sample")
class SampleConfig {

    lateinit var foo: String

    lateinit var bar: String
}

@Component
class SampleLauncher(private val config: SampleConfig) : CommandLineRunner {
    override fun run(vararg args: String?) {
        println(config.foo)
        println(config.bar)
    }
}

在Spring Boot2.1版本之前,为了扫描带有@ConfigurationProperties注解的类,需要使用@Component或@EnableConfigurationProperties注解。

此外,由于需要使用setter方法将设置文件的值绑定到属性上,因此在Kotlin中需要使用lateinit var来定义属性。

如果使用Spring Boot 2.2版本

在Spring Boot 2.2系列中,通过给带有@ConfigurationProperties注解的类添加@ConstructorBinding注解,可以使用构造函数将配置文件的值绑定到属性上,这样在Java中就不需要提供setter方法,在Kotlin中也可以定义属性而不需要使用lateinit var。

另外,需要注意的是,Spring Boot 2.2.0和Spring Boot 2.2.1的部分行为有所不同。

如果是Spring Boot 2.2.0版本

package com.dais39.springboot22kt

import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.ConstructorBinding
import org.springframework.boot.runApplication
import org.springframework.stereotype.Component

@SpringBootApplication
class Springboot22KtApplication

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

@ConstructorBinding
@ConfigurationProperties(prefix = "sample")
class SampleConfig(
    val foo: String,
    val bar: String
)

@Component
class SampleLauncher(private val config: SampleConfig) : CommandLineRunner {

    override fun run(vararg args: String?) {

        println(config.foo)
        println(config.bar)
    }
}

如果在Spring Boot 2.2.0中使用@SpringBootApplication启动应用程序,则会自动扫描带有@ConfigurationProperties注解的类。因此,不需要在JavaConfig上添加@EnableConfigurationProperties注解,也不需要在带有@ConfigurationProperties注解的类上添加@Component注解。

如果使用Spring Boot 2.2.1的情况


package com.dais39.springboot221kt

import org.springframework.boot.CommandLineRunner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.ConfigurationPropertiesScan
import org.springframework.boot.context.properties.ConstructorBinding
import org.springframework.boot.runApplication
import org.springframework.stereotype.Component

@SpringBootApplication
@ConfigurationPropertiesScan // もしくは @EnableConfigurationProperties(SampleConfig::class)
class Springboot221KtApplication

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

@ConstructorBinding
@ConfigurationProperties(prefix = "sample")
class SampleConfig(
    val foo: String,
    val bar: String
)

@Component
class SampleLauncher(private val config: SampleConfig) : CommandLineRunner {

    override fun run(vararg args: String?) {

        println(config.foo)
        println(config.bar)
    }
}

Spring Boot 2.2.1已經修改了默認配置,不再掃描帶有@ConfigurationProperties標註的類。
通過給JavaConfig添加@EnableConfigurationProperties或@ConfigurationPropertiesScan標註,可以使帶有@ConfigurationProperties標註的類能夠被掃描到。如果是沒有使用@ConstructorBinding的類,只需要給帶有@ConfigurationProperties標註的類添加@Component標註,就可以自動進行掃描。

请问可以提供更具体的上下文或原句吗?这样我才能准确地为您提供中文的同义改写。

Spring Boot 2.2 发布说明,@ConfigurationProperties 扫描
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2-Release-Notes#configurationproperties-scanning

Spring Boot 2.2 发布说明,不可变的@ConfigurationProperties绑定

Spring Boot参考文档,2.8. 类型安全的配置属性
https://docs.spring.io/spring-boot/docs/2.2.0.RELEASE/reference/html/spring-boot-features.html#boot-features-external-config-typesafe-configuration-properties

默认情况下启用配置属性扫描会阻止通过扫描找到的@ConfigurationProperties注解类型的条件注册。

bannerAds