springboot的宽松绑定及属性处理类的构造注入
★ 如何使用属性处理类所读取的属性
属性处理类最终变成了Spring容器中的一个Bean组件,因此接下来Spring即可将该Bean组件注入任意其他组件。
这种做法的好处是:可以将大量的配置信息封装一个对象——所以这种方式被称为“类型安全的绑定”。
★ 宽松绑定
不要配置属性名与属性处理类的属性名完全相同。
▲ 比如有如下类:
@ConfigurationProperties(prefix="org.crazyit")
public class FkConfig
{
private String remoteAddress; // Java类中的属性名总是驼峰写法
}
▲ 配置文件中,写成如下几种形式:
1. 最主流,Spring boot推荐写法:
烤串写法: org.ljh.remote-address;
2. 驼峰写法,Spring boot也支持
驼峰写法: org.ljh.remoteAddress;
3. 下划线写法:可选。
org.ljh.remote_address;
4. 全部大写的写法:(原有的点号换成下划线,属性名的单词之间无需任何分隔符。
只用于通过环境变量配置属性时才使用这种写法。
ORG_LJH_REMOTEADDRESS
★ 配置List(数组)
▲ 在*.properties文件中配置List有两种方式:
- 简单地使用英文逗号隔开的多个值,每个值代表一个List元素(如前一个例子所示)
- 用标准的方括号语法来配置List。
▲ 在*.yml文件中配置List也有两种方式:
- 以中划线开头来配置List列表项,
- 或简单地使用英文逗号隔开的多个值。
不管是属性文件,还是*.yml文件,都可用英文逗号隔开的多个值来配置List。
★ 属性处理类(@ConfigurationProperties修饰的类)使用构造器来注入
▲ 两个要求:
1. 使用@ConstructorBinding修饰要执行构造器注入的构造器。
如果该类仅有一个构造器,可直接用@ConstructorBinding修饰该类即可。
——由于该类仅有一个构造器,因此用@ConstructorBinding修饰该类就相当于修饰了唯一的构造器。
2. 只能使用@EnableConfigurationProperties或@ConfigurationPropertiesScan来启用属性处理类。
备注:在这种情况下,不能使用将属性处理类配置成容器中的Bean的形式来启用它。
代码演示:
演示如何通过构造器注入的方式,一次性读取yml配置文件中的多个属性值
解释:
1、使用 @ConstructorBinding 注解 修饰 (要执行构造器注入操作)的构造器;
用 @ConstructorBinding 这个注解就不能用 @Component 来启动 @ConfigurationProperties 注解了
2、修改yml配置的名称,这里我是随便写的,主要是为了体现上面说的宽松绑定(就是驼峰写法,烤串写法之类的)
3、这里只用 getter 方法,不用 setter 方法,因为返回的任何java对象,默认是由Jackson负责将它转换为JSON字符串,因此Jackson默认根据getter方法进行转换
4、然后用@ConfigurationPropertiesScan(“cn.ljh.boot.config”)注解,让springboot去扫描config这个包及其子包下面的处理类
这个构造器注入,和这篇 【使用@ConfigurationProperties注解一次性拿到application.yml 配置文件中的多个属性值】对比下写法
结果: