SpringBoot @ConfigurationProperties使用详解

 更新时间:2020年02月11日 11:07:14   作者:flydean  
这篇文章主要介绍了SpringBoot @ConfigurationProperties使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

简介

本文将会详细讲解@ConfigurationProperties在Spring Boot中的使用。

添加依赖关系

首先我们需要添加Spring Boot依赖:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <relativePath/> <!-- lookup parent from repository -->
</parent>

一个简单的例子

@ConfigurationProperties需要和@Configuration配合使用,我们通常在一个POJO里面进行配置:

@Data
@Configuration
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {

  private String hostName;
  private int port;
  private String from;
}

上面的例子将会读取properties文件中所有以mail开头的属性,并和bean中的字段进行匹配:

#Simple properties
mail.hostname=host@mail.com
mail.port=9000
mail.from=mailer@mail.com

Spring的属性名字匹配支持很多格式,如下所示所有的格式都可以和hostName进行匹配:

mail.hostName
mail.hostname
mail.host_name
mail.host-name
mail.HOST_NAME

如果你不想使用@Configuration, 那么需要在@EnableConfigurationProperties注解中手动导入配置文件如下:

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

我们也可以在@ConfigurationPropertiesScan中指定Config文件的路径:

@SpringBootApplication
@ConfigurationPropertiesScan("com.flydean.config")
public class ConfigPropApp {
  public static void main(String[] args) {
    SpringApplication.run(ConfigPropApp.class,args);
  }
}

这样的话程序只会在com.flydean.config包中查找config文件。

属性嵌套

我们可以嵌套class,list,map, 下面我们举个例子,先创建一个普通的POJO:

@Data
public class Credentials {
  private String authMethod;
  private String username;
  private String password;
}

然后创建一个嵌套的配置文件:

@Data
@Configuration
@ConfigurationProperties(prefix = "nestmail")
public class NestConfigProperties {
  private String host;
  private int port;
  private String from;
  private List<String> defaultRecipients;
  private Map<String, String> additionalHeaders;
  private Credentials credentials;
}

对应的属性文件如下:

# nest Simple properties
nestmail.hostname=mailer@mail.com
nestmail.port=9000
nestmail.from=mailer@mail.com

#List properties
nestmail.defaultRecipients[0]=admin@mail.com
nestmail.defaultRecipients[1]=owner@mail.com

#Map Properties
nestmail.additionalHeaders.redelivery=true
nestmail.additionalHeaders.secure=true

#Object properties
nestmail.credentials.username=john
nestmail.credentials.password=password
nestmail.credentials.authMethod=SHA1

@ConfigurationProperties和@Bean

@ConfigurationProperties也可以和@Bean一起使用如下所示:

@Data
public class Item {
  private String name;
  private int size;
}

看下怎么使用:

@Data
@Configuration
public class BeanConfigProperties {
  @Bean
  @ConfigurationProperties(prefix = "item")
  public Item item() {
    return new Item();
  }
}

属性验证

@ConfigurationProperties可以使用标准的JSR-303格式来做属性验证。我们举个例子:

@Data
@Validated
@Configuration
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {

  @NotEmpty
  private String hostName;
  @Min(1025)
  @Max(65536)
  private int port;
  @Pattern(regexp = "^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,6}$")
  private String from;
}

如果我们的属性不满足上诉条件,可能出现如下异常:

Binding to target org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'mail' to com.flydean.config.ConfigProperties$$EnhancerBySpringCGLIB$$f0f87cb9 failed:

  Property: mail.port
  Value: 0
  Reason: 最小不能小于1025

  Property: mail.hostName
  Value: null
  Reason: 不能为空


Action:

Update your application's configuration


Process finished with exit code 1

属性转换

@ConfigurationProperties也支持多种属性转换,下面我们以Duration和DataSize为例:

我们定义两个Duration的字段:

@ConfigurationProperties(prefix = "conversion")
public class PropertyConversion {
 
  private Duration timeInDefaultUnit;
  private Duration timeInNano;
  ...
}

在属性文件中定义这两个字段:

conversion.timeInDefaultUnit=10
conversion.timeInNano=9ns

我们看到上面的属性可以带单位的。可选的单位是:ns, us, ms, s, m, h 和 d,分别对应纳秒,微妙,毫秒,秒,分钟,小时和天。默认单位是毫秒。我们也可以在注解中指定单位:

@DurationUnit(ChronoUnit.DAYS)
private Duration timeInDays;

对应的配置文件如下:

conversion.timeInDays=2

下面我们再看看DataSize怎么使用:

private DataSize sizeInDefaultUnit;
 
private DataSize sizeInGB;
 
@DataSizeUnit(DataUnit.TERABYTES)
private DataSize sizeInTB;

对应的属性文件:

conversion.sizeInDefaultUnit=300
conversion.sizeInGB=2GB
conversion.sizeInTB=4

Datasize支持B, KB, MB, GB 和TB。

自定义Converter

同样的Spring Boot也支持自定义属性转换器。我们先定义一个POJO类:

public class Employee {
  private String name;
  private double salary;
}

对应的属性文件:

conversion.employee=john,2000

我们需要自己实现一个Converter接口的转换类:

@Component
@ConfigurationPropertiesBinding
public class EmployeeConverter implements Converter<String, Employee> {
 
  @Override
  public Employee convert(String from) {
    String[] data = from.split(",");
    return new Employee(data[0], Double.parseDouble(data[1]));
  }
}

本文的例子可以参看: https://github.com/ddean2009/learn-springboot2/tree/master/springboot-ConfigurationProperties

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java实现读取不同格式的文件的示例详解

    Java实现读取不同格式的文件的示例详解

    在 Java 开发中,我们经常需要读取不同类型的文件,包括 Excel 表格文件、"doc" 等,本文将介绍如何使用 Java 读取这些不同类型的文件,需要的可以参考下
    2024-01-01
  • Kotlin 和 Java 混合开发入门教程

    Kotlin 和 Java 混合开发入门教程

    这篇文章主要介绍了入门 Kotlin 和 Java 混合开发,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java集合中的LinkedHashMap使用解析

    Java集合中的LinkedHashMap使用解析

    这篇文章主要介绍了Java集合中的LinkedHashMap使用解析,LinkedHashMap是继承于HashMap的,所以它的很多属性和方法都是HashMap中的,那么它是怎么实现有序存储的呢,需要的朋友可以参考下
    2023-12-12
  • Java实现接月饼小游戏的示例代码

    Java实现接月饼小游戏的示例代码

    本文将用Java语言自制一个小游戏:《接月饼小游戏》,游戏规则为不要被月亮砸到,尽可能地多接月饼。文中的实现代码讲解清晰,感兴趣的可以动手试一试
    2022-02-02
  • 如何手写一个Spring Boot Starter

    如何手写一个Spring Boot Starter

    这篇文章主要介绍了如何手写一个Spring Boot Starter,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • 浅谈spring方法级参数校验(@Validated)

    浅谈spring方法级参数校验(@Validated)

    这篇文章主要介绍了浅谈spring方法级参数校验(@Validated),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • JAVA泛型的继承和实现、擦除原理解析

    JAVA泛型的继承和实现、擦除原理解析

    这篇文章主要介绍了JAVA泛型的继承和实现、擦除原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • RocketMQ事务消息使用与原理详解

    RocketMQ事务消息使用与原理详解

    这篇文章主要为大家介绍了RocketMQ事务消息的实现原理,在分布式事务解决方案中,事务消息也是一个不错的解决方案,本篇文章将围绕RocketMQ的事务消息实现展开描述,需要的朋友可以参考下
    2023-07-07
  • Java中的泛型

    Java中的泛型

    这篇文章主要介绍为何要泛型,如何使用泛型,自定义泛型的方法,泛型类的子类等多方面介绍了JAVA中的泛型,需要的小伙伴请看下文
    2021-08-08
  • java实现贪吃蛇游戏代码(附完整源码)

    java实现贪吃蛇游戏代码(附完整源码)

    这篇文章主要介绍了java实现贪吃蛇游戏代码(附完整源码),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01

最新评论