简介
说明
本文介绍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

请先 !