资讯专栏INFORMATION COLUMN

Spring Boot中的属性绑定

xfee / 580人阅读

摘要:所以适合简单属性值的获取,不知何复杂对象的绑定。绑定对象绑定绑定列表转换以及默认值绑定过程回调函数,高度定制绑定开始绑定成功绑定失败没有找到匹配的属性绑定结束

Spring Boot中的属性绑定

之前翻译了一篇不怎么样的文章,主要是翻译的水平有限,自己翻译的云里雾里,发现平时只会有@ConfigurationProperties注解,对SpringBoot强大的属性绑定知之甚少,所以以那篇文章为线索,重新学习了一遍。

@ConfigurationProperties

在使用的时候,我们往往只关心两件事,属性怎么绑定,即属性文件中的值和配置类中字段的映射关系;其次是类实例化的时机。故而衍生开来ConfigurationProperties有三种用法。

@Component + @ConfigurationProperties

这种用法最简单,直接在POJO类上加上注解即可,Spring容器初始化时就会生成配置类实例了。适合POJO类是自定义的。

@Component
@ConfigurationProperties(prefix = "kaka.cream.mail-a",ignoreUnknownFields = false)
public class MailPropertiesA {
    private String name;
    private String sex;
    private Integer age;
@Bean + @ConfigurationProperties

在配置类中进行装配,这两个注解均出现在Configuration中,对POJO无侵入,使用灵活,且集中(均在配置类中处理)

@Bean
    @ConfigurationProperties(prefix = "kaka.cream.mail-b",ignoreUnknownFields = false)
    public MailPropertiesB mailPropertiesB(){
        MailPropertiesB b = new MailPropertiesB();
        return b;
    }
@EnableConfigurationProperties + @ConfigurationProperties

Pojo类上注解@ConfigurationProperties,在启动类上注解@EnableConfigurationProperties

@Data
@ConfigurationProperties(prefix = "kaka.cream.mail-c",ignoreUnknownFields = false)
public class MailPropertiesC {
    private String name;
    private String sex;
    private Integer age;
}
@EnableConfigurationProperties(MailPropertiesC.class)
public class GomvcApplicationTests {

可以在启动类上一目了然的看到启动的配置,且不需要配置类,对第三方使用者比较友好,但是灵活性上没有第二种好。在这三种里面,推荐使用第二种方式。

Environment

存在于spring boot首个版本的元老类,它继承自PropertyResolver,通过它,我们能知道激活的配置文件,以及获取对应参数的值,结合上面第二种在配置类中一起用。较常用的主要有

//判断是否包含键值
boolean containsProperty(String key);
//获取属性值,如果获取不到返回null
String getProperty(String key);
//获取属性值,如果获取不到返回缺省值
String getProperty(String key, String defaultValue);
//获取属性对象
 T getProperty(String key, Class targetType);

其中最后一个转换是和Converter有关的,会依据sourceType和targetType查找转换器,这个打算下一个章节进行分析,不在这里展开。所以Environment适合简单属性值的获取,不知何复杂对象的绑定。

Binder

Binder是在Spring Boot2新引入的API,从字面就可以看出来,“主打”绑定,可以非常方便的进行类型转化,以及提供回调方法介入绑定的各个阶段进行深度定制,结合上面第二种在配置类中一起用。其主要的类有Binder, BindResult和BindHandler. 比Environment好用很多,必备好类。

//绑定对象
MailPropertiesC propertiesC = Binder.get(environment).bind("kaka.cream.mail-c", Bindable.of(MailPropertiesC.class)).get();
//绑定Map
Map propMap = Binder.get(environment).bind("fish.jdbc.datasource",Bindable.mapOf(String.class, Object.class)).get();
//绑定列表
List list = Binder.get(environment).bind("kaka.cream.list",Bindable.listOf(String.class)).get();
//转换以及默认值
String datestr =  (String) Binder.get(environment).bind("kaka.cream.date",Bindable.of(String.class))
               .map(String::toUpperCase)
               /** .map(new Function(){
                    @Override
                    public Object apply(Object o) {
                        String str = (String)o;
                        return str.toUpperCase();
                    }
                })**/
               .orElse("bad date string");
               
//绑定过程回调函数,高度定制
LocalDate str =  Binder.get(environment).bind("kaka.cream.date", Bindable.of(LocalDate.class), new BindHandler() {

            @Override
            public  Bindable onStart(ConfigurationPropertyName name, Bindable target,
                                    BindContext context) {
                log.info("绑定开始{}",name);
                return target;
            }
            @Override
            public Object onSuccess(ConfigurationPropertyName name, Bindable target, BindContext context, Object result) {
                log.info("绑定成功{}",target.getValue());
                return result;
            }

            @Override
            public Object onFailure(ConfigurationPropertyName name, Bindable target, BindContext context, Exception error) throws Exception {
                log.info("绑定失败{}",name);
                return "没有找到匹配的属性";
            }

            @Override
            public void onFinish(ConfigurationPropertyName name, Bindable target, BindContext context, Object result) throws Exception {
                log.info("绑定结束{}",name);
            }
        }).get();

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77481.html

相关文章

  • 【译】Spring Boot 2.0的属性绑定

    摘要:比如,在中,不能将属性绑定到对象。引入了新的接口,能够指出属性取值的准确位置。比如,属性绑定的验证异常现在会显示类允许你使用多个。我们计划在中继续加强的功能,而第一个想要支持的功能是不可变属性绑定。 Spring Boot2.0的属性绑定 原文从Spring boot第一个版本以来,我们可以使用@ConfigurationProperties注解将属性绑定到对象。也可以指定属性的各种不...

    1treeS 评论0 收藏0
  • Spring Boot 配置文件中的花样,看这一篇足矣!

    摘要:的默认配置文件位置为。比如,我们需要自定义模块的服务端口号,可以在中添加来指定服务端口为,也可以通过来指定应用名该名字在应用中会被注册为服务名。同时,配置内容都对开发人员可见,本身这也是一种安全隐患。 在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring Boot给我们带来的诸多优点,我们用非常少的代码量就成功的实现了一个Web应用,这是传统的...

    pingan8787 评论0 收藏0
  • Spring Boot 2.0 外部化配置介绍

    摘要:可以使用外部化配置来方便在不同环境的运行同样的程序文件文件环境变量命令行参数内置顺序实现了很多按以下顺序进行合理的相同属性的覆盖目录下的全局设置属性,如果激活测试用例上的注解测试用例上的注解。 简介 在应用中管理配置并不是一个容易的任务,尤其是在应用需要部署到多个环境中时。通常会需要为每个环境提供一个对应的属性文件,用来配置各自的数据库连接信息、服务器信息和第三方服务账号等。通常的应用...

    lmxdawn 评论0 收藏0
  • @ConfigurationProperties 注解使用姿势,这一篇就够了

    摘要:在项目中,为满足以上要求,我们将大量的参数配置在或文件中,通过注解,我们可以方便的获取这些参数值使用配置模块假设我们正在搭建一个发送邮件的模块。这使得在不影响其他模块的情况下重构一个模块中的属性变得容易。 在编写项目代码时,我们要求更灵活的配置,更好的模块化整合。在 Spring Boot 项目中,为满足以上要求,我们将大量的参数配置在 application.properties 或...

    SolomonXie 评论0 收藏0
  • @ConfigurationProperties 注解使用姿势,这一篇就够了

    摘要:在项目中,为满足以上要求,我们将大量的参数配置在或文件中,通过注解,我们可以方便的获取这些参数值使用配置模块假设我们正在搭建一个发送邮件的模块。这使得在不影响其他模块的情况下重构一个模块中的属性变得容易。 在编写项目代码时,我们要求更灵活的配置,更好的模块化整合。在 Spring Boot 项目中,为满足以上要求,我们将大量的参数配置在 application.properties 或...

    KoreyLee 评论0 收藏0

发表评论

0条评论

xfee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<