9B5.配置中的绑定
原创实战属性大约 2 分钟
9B5.配置中的绑定
列出 ConfigurationProperties 中常见的属性绑定事项。
参考资料为Type-safe Configuration Properties
9B5.1.普通Pojo的JavaBean
- 基本类型字段,如果希望null,则使用包装类
- 空构造函数,和良好的getters/setters规范
- 以下类型,非immutable时,可以省略setter
- Map 推荐new,可用emptyMap,不推荐null
- Collection,推荐new,可用emptySet等,不推荐null
- Array,推荐new,不推荐null
- nested POJO,推荐new,不推荐null
- 以上不推荐null是因为wings主张NotNull和默认值
- 不推荐 @ConstructorBinding
9B5.2.第三方类的配置
不能够或不方便直接@ConfigurationProperties的类,配合@Bean注解。
@Bean
@ConfigurationProperties(prefix = "another")
public AnotherComponent anotherComponent() {
return new AnotherComponent();
}
9B5.3.属性名的风格
尽管spring支持宽松匹配,包括,
- kebab - my.main-project.person.first-name
- camel - my.main-project.person.firstName
- underscore - my.main-project.person.first_name
- UPPER - MY_MAINPROJECT_PERSON_FIRSTNAME
Wings中,配置文件使用properties,推荐全小写的kebab, 而环境变量,推荐全大写的UPPER。
环境变量的规则为,①以_
替换.
,②移除-
,③全大写
spring.main.log-startup-info
-SPRING_MAIN_LOGSTARTUPINFO
my.service[0].other
-MY_SERVICE_0_OTHER
9B5.4.Map属性的格式
绑定my.map
到Map<String,String>
属性,以下为key关系
key1
-my.map.key1=value1
/key2
-my.map.[/key2]=value2
key3
-my.map./key3=value3
a.b
-my.map.a.b=value4
Spring支持scalar
值,包括enum
, java.lang.*
(Object除外), 可以不用[]
,如a.b
示例,及spring.mail.properties.mail.debug
但Wings推荐,
- 不易混淆的key可直接使用,否则都建议使用
[]
- spring体系内,以spring为主,如spring.mail
9B5.5.属性合并与覆盖
当属性存在于多份配置文件时,集合类为全覆盖,键值对为合并
- Array/List/Set - 不会合并,以优先级高的文件内容全覆盖
- Map/Pojo - 会合并,以优先级覆盖key
9B5.6.时间段Duration和Period
spring对java.time.Duration和Period进行了实用性扩展,单位全小写
@DurationUnit
默认millisecondsus
- microsecondsms
- milliseconds,PT0.5S
等于500ms
s
- secondsm
- minutesh
- hoursd
- days@PeriodUnit
默认 daysy
- yearsm
- monthsw
- weeksd
- days
9B5.7.数据大小 DataSize
单位全大写
@DataSizeUnit
默认bytes- 'B' - bytes
- 'KB' - kilobytes
- 'MB' - megabytes
- 'GB' - gigabytes
- 'TB' - terabytes
9B5.8.和@Value的区别
- @ConfigurationProperties - 宽松绑定(Relaxed binding),不支持SpEL
- @Value - 仅
kebab
格式可宽松绑定,支持SpEL
关键@Value不支持type-safe的prefix形式的复杂类型注入,仅单key,简单类型。