SpringBoot中@ConfigurationProperties实现配置自动绑定的方法
目录
- 代码
- 构造器绑定
- 结合@PropertySource
代码
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
注解修饰的类创建bean
,因此UserProperties
实例可以自动注入到控制器中。
@EnableConfigurationProperties(value = {UserProperties.class}) @ConfigurationPropertiesScan(basePackageClasses = {UserProperties.class})
而@ConfigurationPropertiesScan
注解还可以指定要被扫描的包数组。
@ConfigurationPropertiesScan(basePackages = {"com.kaven.springboot.config"})
启动应用,访问http://localhost:8080/config
。
效果符合预期。
构造器绑定
Spring Boot
将配置文件中的配置自动绑定到配置类,无非就是通过反射等手段,创建配置类实例,而配置项需要绑定到配置类实例的属性,这一般通过属性的set
方法或者构造器来实现,上面的演示是通过set
方法来进行绑定,这是@Setter
注解的效果。
@Setter
如果需要通过构造器将配置项绑定到配置类实例的属性,可以使用@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
注解修饰类的问题在于类中可能有多个构造器,如果出现这种情况就会有问题。
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
不知道调用哪个构造器。
可以将@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 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; } }
结合@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
实现配置自动绑定就介绍到这里,,更多相关SpringBoot @ConfigurationProperties 自动绑定内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
赞 (0)