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
这是项目结构。
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
文件。
spring.main.banner-mode=off app.colour=steelblue app.lang=en app.theme=dark
在 application.properties
文件中,我们有三个自定义属性。它们具有 app
前缀。
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
中,我们设置了属性的前缀。
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
注入到一个字段中并读取其值。
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
这是项目结构。
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
依赖项。
spring.main.banner-mode=off
这是 application.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
文件。
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
注解验证属性。
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
并读取它们。
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
从外部文件读取配置属性。