SpringBoot中@ConfigurationProperties實現(xiàn)配置自動綁定的方法
代碼
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
</parent>
<packaging>jar</packaging>
<groupId>com.kaven</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot</name>
<description>springboot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置類:
package com.kaven.springboot.config;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ConfigurationProperties(prefix = "user")
@Setter
@ToString
public class UserProperties {
private String username;
private String password;
private Set<String> hobbies;
private Map<String, Integer> scores;
private List<UserToken> userToken;
}
UserToken類:
package com.kaven.springboot.config;
import lombok.Setter;
import lombok.ToString;
@Setter
@ToString
public class UserToken {
private String token;
}
接口:
package com.kaven.springboot.controller;
import com.kaven.springboot.config.UserProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class ConfigController {
@Resource
private UserProperties userProperties;
@GetMapping("/config")
public String getConfig() {
return userProperties.toString();
}
}
application.properties:
user.username="kaven" user.password="itkaven" user.hobbies[0]="A" user.hobbies[1]="B" user.hobbies[2]="C" user.scores.mathematics=145 user.scores.english=80 user.user-token[0].token="A" user.user-token[1].token="B" user.user-token[2].token="C"
啟動類:
package com.kaven.springboot;
import com.kaven.springboot.config.UserProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@SpringBootApplication
@EnableConfigurationProperties(value = {UserProperties.class})
//@ConfigurationPropertiesScan(basePackageClasses = {UserProperties.class})
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringbootApplication.class);
application.run(args);
}
}
下面這兩個注解都可以使得Spring Boot基于被@ConfigurationProperties注解修飾的類創(chuàng)建bean,因此UserProperties實例可以自動注入到控制器中。
@EnableConfigurationProperties(value = {UserProperties.class})
@ConfigurationPropertiesScan(basePackageClasses = {UserProperties.class})
而@ConfigurationPropertiesScan注解還可以指定要被掃描的包數(shù)組。
@ConfigurationPropertiesScan(basePackages = {"com.kaven.springboot.config"})
啟動應用,訪問http://localhost:8080/config。

效果符合預期。
構(gòu)造器綁定
Spring Boot將配置文件中的配置自動綁定到配置類,無非就是通過反射等手段,創(chuàng)建配置類實例,而配置項需要綁定到配置類實例的屬性,這一般通過屬性的set方法或者構(gòu)造器來實現(xiàn),上面的演示是通過set方法來進行綁定,這是@Setter注解的效果。
@Setter
如果需要通過構(gòu)造器將配置項綁定到配置類實例的屬性,可以使用@ConstructorBinding注解。
package com.kaven.springboot.config;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ConfigurationProperties(prefix = "user")
@ToString
@ConstructorBinding
public class UserProperties {
private String username;
private String password;
private Set<String> hobbies;
private Map<String, Integer> scores;
private List<UserToken> userToken;
public UserProperties(String username,
String password,
Set<String> hobbies,
Map<String, Integer> scores,
List<UserToken> userToken) {
this.username = username;
this.password = password;
this.hobbies = hobbies;
this.scores = scores;
this.userToken = userToken;
}
}
使用@ConstructorBinding注解修飾類的問題在于類中可能有多個構(gòu)造器,如果出現(xiàn)這種情況就會有問題。
package com.kaven.springboot.config;import lombok.ToString;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.context.properties.ConstructorBinding;import java.util.List;import java.util.Map;import java.util.Set;@ConfigurationProperties(prefix = "user")@ToString@ConstructorBindingpublic class UserProperties {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--> private String username; private String password; private Set<String> hobbies; private Map<String, Integer> scores; private List<UserToken> userToken; public UserProperties() {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->} public UserProperties(String username, String password, Set<String> hobbies, Map<String, Integer> scores, List<UserToken> userToken) {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--> this.username = username; this.password = password; this.hobbies = hobbies; this.scores = scores; this.userToken = userToken; }}因為Spring Boot不知道調(diào)用哪個構(gòu)造器。

可以將@ConstructorBinding注解修飾在構(gòu)造器上。
package com.kaven.springboot.config;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ConfigurationProperties(prefix = "user")
@ToString
public class UserProperties {
private String username;
private String password;
private Set<String> hobbies;
private Map<String, Integer> scores;
private List<UserToken> userToken;
public UserProperties() {}
@ConstructorBinding
public UserProperties(String username,
String password,
Set<String> hobbies,
Map<String, Integer> scores,
List<UserToken> userToken) {
this.username = username;
this.password = password;
this.hobbies = hobbies;
this.scores = scores;
this.userToken = userToken;
}
}

結(jié)合@PropertySource
SourceConfig類:
package com.kaven.springboot.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource(value = "classpath:/static/user.properties")
public class SourceConfig {}


效果符合預期,@ConfigurationProperties實現(xiàn)配置自動綁定就介紹到這里,,更多相關(guān)SpringBoot @ConfigurationProperties 自動綁定內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中@ConfigurationProperties注解的使用與源碼詳解
- SpringBoot @ConfigurationProperties使用詳解
- springboot中@ConfigurationProperties無效果的解決方法
- SpringBoot @ConfigurationProperties注解的簡單使用
- springboot如何靜態(tài)加載@configurationProperties
- springboot @ConfigurationProperties和@PropertySource的區(qū)別
- SpringBoot中@ConfigurationProperties 配置綁定
- SpringBoot中的@ConfigurationProperties注解的使用
- 深入解析Spring Boot中的@ConfigurationProperties注解
相關(guān)文章
IDEA 單元測試報錯:Class not found:xxxx springb
這篇文章主要介紹了IDEA 單元測試報錯:Class not found:xxxx springboot的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
Netty網(wǎng)絡編程實戰(zhàn)之搭建Netty服務器
Netty是JBOSS開源的一款NIO網(wǎng)絡編程框架,可用于快速開發(fā)網(wǎng)絡的應用。Netty是一個異步的、基于事件驅(qū)動的網(wǎng)絡應用框架,用于快速開發(fā)高性能的服務端和客戶端。本文將詳細說說如何搭建Netty服務器,需要的可以參考一下2022-10-10
Spring?Cloud實現(xiàn)遠程調(diào)用OpenFeign組件的方法
本文主要介紹了SpringCloud中實現(xiàn)遠程調(diào)用的組件OpenFeign的相關(guān)知識與操作,包括OpenFeign的介紹、快速上手、參數(shù)傳遞和最佳實踐,感興趣的朋友跟隨小編一起看看吧2026-02-02
Springboot整合quartz實現(xiàn)多個定時任務實例
這篇文章主要介紹了Springboot整合quartz實現(xiàn)多個定時任務代碼實例,Quartz?是一款功能強大的開源任務調(diào)度框架,幾乎可以集成到任何?Java?應用程序中,Quartz?可用于創(chuàng)建簡單或復雜的任務調(diào)度,用以執(zhí)行數(shù)以萬計的任務,需要的朋友可以參考下2023-08-08

