当前位置:主页 > java教程 > Spring Boot中属性绑定实现详解

Spring Boot中属性绑定的实现方法

发布:2019-06-28 15:52:54 122


本站收集了一篇相关的编程文章,网友糜乐邦根据主题投稿了本篇教程内容,涉及到SpringBoot、属性绑定、Spring Boot中属性绑定实现详解相关内容,已被318网友关注,内容中涉及的知识点可以在下方直接下载获取。

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> T getProperty(String key, Class<T> 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<String,Object> propMap = Binder.get(environment).bind("fish.jdbc.datasource",Bindable.mapOf(String.class, Object.class)).get();
//绑定列表
List<String> 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 <T> Bindable<T> onStart(ConfigurationPropertyName name, Bindable<T> 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();

 


参考资料

相关文章

  • SpringBoot和SpringBatch用法详解

    发布:2019-09-15

    Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。这篇文章主要介绍了详解SpringBoot和SpringBatch 使用,需要的朋友可以参考下


  • springboot使用alibaba的druid数据库连接池错误的问题及解决

    发布:2023-03-22

    这篇文章主要介绍了springboot使用alibaba的druid数据库连接池错误的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教


  • Springboot主程序类注解配置过程图解

    Springboot主程序类注解配置过程图解

    发布:2022-11-28

    给大家整理了关于Springboot的教程,这篇文章主要介绍了Springboot主程序类注解配置过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下


  • Springboot项目平滑关闭及自动化关闭脚本详解

    发布:2020-02-04

    这篇文章主要为大家详细介绍了Springboot项目平滑关闭及自动化关闭脚本,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • Springboot容器级后置处理器BeanDefinitionRegistryPostProcessor

    发布:2023-03-02

    这篇文章主要介绍了Springboot容器级后置处理器BeanDefinitionRegistryPostProcessor,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧


  • Springboot引用外部配置文件的实例方法

    发布:2019-07-31

    这篇文章主要介绍了Springboot引用外部配置文件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


  • maven如何利用springboot的配置文件进行多个环境的打包

    发布:2023-04-09

    这篇文章主要介绍了maven如何利用springboot的配置文件进行多个环境的打包,在Spring Boot中多环境配置文件名需要满足application-{profiles.active}.properties的格式,其中{profiles.active}对应你的环境标识,本文给大家详细讲解,需要的朋友可以参考下


  • SpringBoot集成validation校验参数遇到的坑

    发布:2022-06-29

    给大家整理了关于SpringBoot的教程,这篇文章主要介绍了SpringBoot集成validation校验参数遇到的坑,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下


网友讨论