0
点赞
收藏
分享

微信扫一扫

Spring Boot:@ConfigurationProperties实现配置自动绑定


代码

​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:@ConfigurationProperties实现配置自动绑定_构造器

效果符合预期。

构造器绑定

​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
@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() {}

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;
}
}

因为​​Spring Boot​​不知道调用哪个构造器。

Spring Boot:@ConfigurationProperties实现配置自动绑定_java_02


可以将​​@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;
}
}

Spring Boot:@ConfigurationProperties实现配置自动绑定_构造器_03

结合@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 {}

Spring Boot:@ConfigurationProperties实现配置自动绑定_spring boot_04


Spring Boot:@ConfigurationProperties实现配置自动绑定_spring boot_05


效果符合预期,​​@ConfigurationProperties​​实现配置自动绑定就介绍到这里,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。


举报

相关推荐

0 条评论