ZetCode

Spring Boot @ConfigurationProperties

最后修改于 2023 年 7 月 18 日

Spring Boot @ConfigurationProperties 教程展示了如何在 Spring Boot 应用程序中使用 @ConfigurationProperties 将属性绑定到对象。

Spring 是一个流行的 Java 应用程序框架,而 Spring Boot 是 Spring 的一个演进,它有助于轻松创建独立的、生产级的基于 Spring 的应用程序。

@ConfigurationProperties

@ConfigurationProperties 允许轻松地将整个 Properties 和 Yaml 文件映射到对象。它还允许使用 JSR-303 bean 验证来验证属性。默认情况下,该注解从 application.properties 文件中读取。可以使用 @PropertySource 注解更改源文件。

Spring Boot @ConfigurationProperties 示例

以下应用程序从 application.properties 文件中读取配置数据,该文件是默认的 Spring Boot 配置文件。

build.gradle
...
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           │   MyRunner.java
│   │           └───conf
│   │                   AppProperties.java
│   └───resources
│           application.properties
└───test
    └───java

这是项目结构。

build.gradle
plugins {
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}

group = 'com.zetcode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
}

这是 build.gradle 文件。

resources/application.properties
spring.main.banner-mode=off

app.colour=steelblue
app.lang=en
app.theme=dark

application.properties 文件中,我们有三个自定义属性。它们具有 app 前缀。

com/zetcode/conf/AppProperties.java
package com.zetcode.conf;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private String colour;
    private String lang;
    private String theme;

    public String getColour() {
        return colour;
    }

    public void setColour(String colour) {
        this.colour = colour;
    }

    public String getLang() {
        return lang;
    }

    public void setLang(String lang) {
        this.lang = lang;
    }

    public String getTheme() {
        return theme;
    }

    public void setTheme(String theme) {
        this.theme = theme;
    }
}

这些属性将绑定到此配置对象。

@Configuration
@ConfigurationProperties(prefix = "app")
public class AppProperties {

@Configuration 注解使其成为一个 Spring 管理的 bean。在 @ConfigurationProperties 中,我们设置了属性的前缀。

com/zetcode/MyRunner.java
package com.zetcode;

import com.zetcode.conf.AppProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class MyRunner implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(Application.class);

    private final AppProperties appProperties;

    @Autowired
    public MyRunner(AppProperties appProperties) {
        this.appProperties = appProperties;
    }

    @Override
    public void run(String... args) throws Exception {

        logger.info("Colour: {}", appProperties.getColour());
        logger.info("Language: {}", appProperties.getLang());
        logger.info("Theme: {}", appProperties.getTheme());
    }
}

MyRunner 中,我们将 AppProperties 注入到一个字段中并读取其值。

com/zetcode/Application.java
package com.zetcode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application  {
    
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Application 是设置 Spring Boot 应用程序的入口点。

Spring Boot @ConfigurationProperties 示例 II

在第二个应用程序中,我们还将验证属性。

build.gradle 
...
src
├───main
│   ├───java
│   │   └───com
│   │       └───zetcode
│   │           │   Application.java
│   │           │   MyRunner.java
│   │           └───conf
│   │                   MailProperties.java
│   └───resources
│           application.properties
│           mail.properties
└───test
    └───java

这是项目结构。

build.gradle
plugins {
    id 'org.springframework.boot' version '3.1.1'
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'
}

group = 'com.zetcode'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.hibernate.validator:hibernate-validator'
}

这是 build.gradle 文件。我们有一个额外的 hibernate-validator 依赖项。

resources/application.properties
spring.main.banner-mode=off

这是 application.properties 文件。

resources/mail.properties
hostname=info@example.com
port=9000
from=admin@example.com

recipients[0]=user1@example.com
recipients[1]=user2@example.com
recipients[2]=user3@example.com
recipients[3]=user4@example.com

我们有一个自定义的 mail.properties 文件。

com/zetcode/config/MailProperties.java
package com.zetcode.conf;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.validation.annotation.Validated;

import java.util.List;

@Configuration
@PropertySource("classpath:mail.properties")
@ConfigurationProperties
@Validated
public class MailProperties {

    @NotNull
    private String hostname;

    @Min(1000)
    @Max(10000)
    private int port;

    @NotNull
    private String from;

    @NotNull
    private List>String> recipients;

    public String getHostname() {
        return hostname;
    }

    public void setHostname(String hostname) {
        this.hostname = hostname;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public List>String> getRecipients() {
        return recipients;
    }

    public void setRecipients(List>String> recipients) {
        this.recipients = recipients;
    }
}

我们使用 @PropertySource 注解设置自定义属性文件的路径。 @Validated 注解验证属性。

com/zetcode/MyRunner.java
package com.zetcode;

import com.zetcode.conf.MailProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class MyRunner implements CommandLineRunner {

    private static final Logger logger = LoggerFactory.getLogger(Application.class);

    private final MailProperties mailProperties;

    @Autowired
    public MyRunner(MailProperties mailProperties) {
        this.mailProperties = mailProperties;
    }

    @Override
    public void run(String... args) throws Exception {

        logger.info("Hostname: {}", mailProperties.getHostname());
        logger.info("Port: {}", mailProperties.getPort());
        logger.info("From: {}", mailProperties.getFrom());
        logger.info("Recipients: {}", mailProperties.getRecipients());
    }
}

我们在 run 方法中注入 MailProperties 并读取它们。

com/zetcode/Application.java
package com.zetcode;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

这是 Application 类。

我们使用 ./gradlew bootRun 运行应用程序。

在本文中,我们展示了如何使用 @ConfigurationProperties 从外部文件读取配置属性。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出 所有 Spring Boot 教程