Administrator
发布于 2024-10-22 / 6 阅读
0
0

SpringBoot Yaml Properties

Duration (java.time.Duration) 在yaml properties 中的配置方法

在RedisProperties的配置中,使用到了Duration类,来表示时间属性,这里记录下

image-20241022161320178

实际样例:

host: 218.94.128.34
port: 16379
database: 4
password: long123456@HhRedis
timeout: 15000ms   # 这个就是使用了Duration类型
lettuce:
  pool:
    min-idle: 0
    max-idle: 8
    max-active: 8
    max-wait: -1

通过源码找到springboot的转换器StringToDurationConverter,其中转换的核心代码使用了DurationStyle定义了时间格式:

// org.springframework.boot.convert.StringToDurationConverter


	private Duration convert(String source, DurationStyle style, ChronoUnit unit) {
		style = (style != null) ? style : DurationStyle.detect(source);
		return style.parse(source, unit);
	}

我们在DurationStyle中可以看到有两种格式( 简单格式 和 ISO-8601格式 )的支持:

// org.springframework.boot.convert.DurationStyle

/**
	 * Simple formatting, for example '1s'.
	 */
	SIMPLE("^([+-]?\\d+)([a-zA-Z]{0,2})$")
        


/**
	 * ISO-8601 formatting.
	 */
	ISO8601("^[+-]?[pP].*$")


DurationStyle中简单格式支持的单位定义在下方的Unit枚举中:

// org.springframework.boot.convert.DurationStyle.Unit

/**
 * Nanoseconds.
 */
NANOS(ChronoUnit.NANOS, "ns", Duration::toNanos),

/**
 * Microseconds.
 */
MICROS(ChronoUnit.MICROS, "us", (duration) -> duration.toNanos() / 1000L),

/**
 * Milliseconds.
 */
MILLIS(ChronoUnit.MILLIS, "ms", Duration::toMillis),

/**
 * Seconds.
 */
SECONDS(ChronoUnit.SECONDS, "s", Duration::getSeconds),

/**
 * Minutes.
 */
MINUTES(ChronoUnit.MINUTES, "m", Duration::toMinutes),

/**
 * Hours.
 */
HOURS(ChronoUnit.HOURS, "h", Duration::toHours),

/**
 * Days.
 */
DAYS(ChronoUnit.DAYS, "d", Duration::toDays);

DataSize(org.springframework.util.unit.DataSize)在yaml properties 中的配置方法

在org.springframework.boot.autoconfigure.web.servlet.MultipartProperties中,配置上传的文件大小,就使用了DataSize类型

image-20241022163709214

实际配置样例:

spring:
  servlet:
    multipart:
      max-file-size: 16MB # 单个文件大小
      max-request-size: 32MB # 设置总上传的文件大小

通过源码找到springboot的转换器StringToDataSizeConverter,其中转换的核心代码使用了DataUnit定义了数据单位格式:

org.springframework.boot.convert.StringToDataSizeConverter

private DataUnit getDataUnit(TypeDescriptor targetType) {
		DataSizeUnit annotation = targetType.getAnnotation(DataSizeUnit.class);
		return (annotation != null) ? annotation.value() : null;
	}

	private DataSize convert(String source, DataUnit unit) {
		return DataSize.parse(source, unit);
	}

我们在DataUnit中,可以看到支持以下单位:

// org.springframework.util.unit.DataUnit

	/**
	 * Bytes, represented by suffix {@code B}.
	 */
	BYTES("B", DataSize.ofBytes(1)),

	/**
	 * Kilobytes, represented by suffix {@code KB}.
	 */
	KILOBYTES("KB", DataSize.ofKilobytes(1)),

	/**
	 * Megabytes, represented by suffix {@code MB}.
	 */
	MEGABYTES("MB", DataSize.ofMegabytes(1)),

	/**
	 * Gigabytes, represented by suffix {@code GB}.
	 */
	GIGABYTES("GB", DataSize.ofGigabytes(1)),

	/**
	 * Terabytes, represented by suffix {@code TB}.
	 */
	TERABYTES("TB", DataSize.ofTerabytes(1));

评论