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

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

(0)

相关推荐

  • SpringBoot注解梳理(小结)

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration注解.其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文. @Configuration 等同于spring的XML配置文件:使用Java代码可以检查类型安全. @EnableAutoConfiguration 自动配置. @Compon

  • 浅谈springBoot注解大全

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration注解.其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文. @Configuration 等同于spring的XML配置文件:使用Java代码可以检查类型安全. @EnableAutoConfiguration 自动配置. @Compon

  • SpringBoot @ConfigurationProperties使用详解

    简介 本文将会详细讲解@ConfigurationProperties在Spring Boot中的使用. 添加依赖关系 首先我们需要添加Spring Boot依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <relativePath/> <!-- lookup

  • Java SpringBoot自定义starter详解

    目录 一.什么是SpringBoot starter机制 二.为什么要自定义starter ? 三.什么时候需要创建自定义starter? 四.自定义starter的开发流程(案例:为短信发送功能创建一个starter) 1.细节:命名规范 2.必须引入的依赖 3.编写相关属性类(XxxProperties):例如 SmsProperties.java 4.编写Starter项目的业务功能 5.编写自动配置类AutoConfig 6.编写spring.factories文件加载自动配置类 7.打

  • SpringBoot 统一异常处理详解

    代码结构 配置pom文件 <?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/

  • Java下SpringBoot创建定时任务详解

    序言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了. 三.基于注解设定多线程定时任务 一.静态:基于注解 基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响. 1.创建定时器 使用SpringBoo

  • springboot集成es详解

    1.导入 maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-dataelasticsearch</artifactId> <dependency> 注意 保持版本一致 我用的是7.6.2版本的 <properties> <java.version>1.8</jav

  • SpringBoot任务之详解邮件任务

    01: 异步任务 02: 定时任务 一.SpringBoot--任务:邮件任务 1.1 添加依赖(增加邮件支持) pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 1.2 获取第三方授权码 1.2.1 登录QQ邮箱 1.2.2 点

  • Java SpringBoot 集成 Redis详解

    目录 1.概述 Redis是什么? Redis能该干什么? 特性 2.测试Redis 3.自定义redisTemplate 1.概述 Redis是什么? Redis(Remote Dictionary Server ),即远程字典服务. 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加

  • springboot与vue详解实现短信发送流程

    目录 一.前期工作 1.开启邮箱服务 2.导入依赖 3.配置application.yaml文件 二.实现流程 1.导入数据库 2.后端实现 编写实体类 编写工具类ResultVo 编写dao层接口 配置dao层接口的数据库操作 编写service层接口 编写service层的实现方法 实现controller层 Test代码 前端页面的实现 运行截图+sql图 总结 一.前期工作 1.开启邮箱服务 开启邮箱的POP3/SMTP服务(这里以qq邮箱为例,网易等都是一样的) 2.导入依赖 在spr

  • SpringBoot入门教程详解

    目录 一.SpringBoot简介 二.SpringBoot入门案例 1.创建项目 2.编写 Controller 类 3.启动项目 4.使用 Postman 测试 三.SpringBoot VS Spring 四.在官网中构建工程 六.SpringBoot 是如何实现简化开发的 1.启动依赖 2.引导类 七.切换 Web 一.SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程. 我们在学习 S

  • 使用SpringBoot自定义starter详解

    一.新建一个工程 工程由xxx-sprig-boot-starter和xxx-sprig-boot-starter-configure两个模块组成: xxx-sprig-boot-starter模块 只用来做依赖导入 依赖于 xxx-sprig-boot-starter-configure模块,没有实际代码 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave

随机推荐