简介
说明
本文介绍SpringBoot的yml(properties)配置文件的时间/大小的单位转换。
概述
SpringBoot可以将yml中的配置绑定到一个Java类的字段,而且支持单位的转换。以时间为例,yml中指定为2m,则可以用Duration来接收这个字段,接收到的字段值为3分钟。
注意
本处的单位转换支持配置放到一个类中,也支持@Value等。
时间的转换
概述
Spring 使用 java.time.Duration 类代表时间大小,以下场景适用:
- 除非指定 @DurationUnit ,否则一个 long 代表的时间为毫秒。
- ISO-8601 标准格式( java.time.Duration 的实现就是参照此标准)
- 你也可以使用以下支持的单位(用大写也可以):
- ns – 纳秒
- us – 微秒
- ms – 毫秒
- s – 秒
- m – 分
- h – 时
- d – 天
示例
application.yml
custom: monitor: name: myMonitor interval: 3m
实体类
package com.knife.config; import lombok.Data; import java.time.Duration; @Data public class MonitorProperty { private String name; private Duration interval; }
配置类
package com.knife.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MonitorConfig { @ConfigurationProperties(prefix = "custom.monitor") @Bean public MonitorProperty monitorProperty() { return new MonitorProperty(); } }
测试类
package com.knife.controller; import com.knife.config.MonitorProperty; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Autowired private MonitorProperty monitorProperty; @GetMapping("/test") public String test() { return "test success"; } }
测试
打个断点,然后请求:
工具类实例
SpringBoot的转换时间的工具类是:DurationStyle(org.springframework.core.convert.support包)。
示例:
import org.springframework.core.convert.support.DurationStyle; import java.time.Duration; public class MyApp { public static void main(String[] args) { String durationString = "3m"; Duration duration = DurationStyle.SIMPLE.parse(durationString); System.out.println(duration); // 输出 PT3M (3 minutes) } }
大小的转换
概述
Spring 使用 DataSize 类代表数据大小,以下场景适用:
- long 值(默认视为 byte)
- 你也可以使用以下支持的单位:
- B
- KB
- MB
- GB
- TB
示例
修改上边示例中的两个文件:
application.yml
custom: monitor: name: myMonitor interval: 3m size: 3KB
实体类
package com.knife.config; import lombok.Data; import java.time.Duration; import org.springframework.util.unit.DataSize; @Data public class MonitorProperty { private String name; private Duration interval; private DataSize size; }
测试
打个断点,然后请求:
工具类实例
SpringBoot的转换时间的工具类是:DataSize。
package com.knife.example.demo; import org.springframework.util.unit.DataSize; public class Demo { public static void main(String[] args) { DataSize dataSize = DataSize.parse("2KB"); System.out.println(dataSize.toBytes()); } }
打印结果
2048
请先
!