专栏首页SpringBoot 核心技术SpringBoot2.x基础篇:谈谈SpringBoot内提供的这几种配置绑定

SpringBoot2.x基础篇:谈谈SpringBoot内提供的这几种配置绑定

知识改变命运,撸码使我快乐,2020继续游走在开源界 点赞再看,养成习惯 给我来个Star吧,点击了解下基于SpringBoot的组件化接口服务落地解决方案

常见配置绑定方式

SpringBoot在不断地版本迭代中陆续提供了不同的配置参数绑定的方式,我们可以单独获取一个配置参数也可以将一系列的配置映射绑定到JavaBean的属性字段,下面我们来看看这几种方式的配置绑定哪一种是你最常用到的。

推荐阅读

示例配置参数

system:
  config:
    app-id: hengboy
    app-secret: yuqiyu@admin

上面是一段示例的配置参数,提供给下面的配置绑定方式来使用。

@Configuration方式绑定

当我们需要将一个配置前缀下的参数映射绑定到JavaBean的属性字段时,我们可以考虑使用@ConfigurationProperties + @Configuration注解组合的方式,使用如下所示:

/**
 * 系统配置
 *
 * @author 恒宇少年
 */
@Configuration
@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)
@Data
public class SystemConfig {
    /**
     * 系统配置前缀
     */
    public static final String SYSTEM_CONFIG_PREFIX = "system.config";

    private String appId;
    private String appSecret;
}

注意事项:配置参数与JavaBean属性之间的绑定是通过调用JavaBean属性的Setter方法来赋值的,所以我们需要提供对应属性字段的Setter方法。

由于@Configuration注解被@Component修饰,所以我们在使用时只需要注入SystemConfig配置绑定映射类即可,通过Getter方法来获取对应配置参数的值。

配置扫描路径方式绑定

如果你系统中需要创建的配置映射类较多,而且每一个类都需要交付给IOC容器进行托管,那么可以考虑使用@ConfigurationPropertiesScan + @ConfigurationProperties注解组合的方式,使用如下所示:

@SpringBootApplication
@ConfigurationPropertiesScan
public class ConfigureBindingAwayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConfigureBindingAwayApplication.class, args);
    }
}

我们首先需要在XxxApplication应用程序启动类上添加@ConfigurationPropertiesScan注解,表示我们需要使用自动扫描的方式来注册配置映射类,注解配置参数如下所示:

  • value:配置扫描的基础package,与basePackages作用一致,通过数组的形式来接收配置。
  • basePackages:配置扫描的基础package
  • basePackageClasses:配置基础扫描类,会将每一个扫描类所处于的package作为扫描基础package

当我们在使用@ConfigurationPropertiesScan注解时,如果不进行自定义扫描路径,默认使用SpringBoot应用程序扫描的packages

使用这种方式我们配置映射类就不再需要添加@Configuration注解了,这是因为我们在使用@ConfigurationPropertiesScan注解时,会通过@Import方式来引用配置映射类的注册实现,详见:org.springframework.boot.context.properties.ConfigurationPropertiesScanRegistrar#registerBeanDefinitions,配置映射类如下所示:

/**
 * 系统配置
 *
 * @author 恒宇少年
 */
@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)
@Data
public class SystemConfig {
    /**
     * 系统配置前缀
     */
    public static final String SYSTEM_CONFIG_PREFIX = "system.config";

    private String appId;
    private String appSecret;
}

构造函数方式绑定

在上面的两种方式都是通过Setter方法来进行映射字段的赋值,而构造函数绑定方式是通过构造函数来进行赋值的,我们只需要在配置映射类上添加@ConstructorBinding注解并提供对应的构造函数即可,使用方式如下所示:

/**
 * 系统配置
 *
 * @author 恒宇少年
 */
@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)
@ConstructorBinding
@Getter
public class SystemConfig {
    /**
     * 系统配置前缀
     */
    public static final String SYSTEM_CONFIG_PREFIX = "system.config";

    public SystemConfig(String appId, String appSecret) {
        this.appId = appId;
        this.appSecret = appSecret;
    }

    private String appId;
    private String appSecret;
}

在之前我也写过一篇关于构造函数映射配置参数的问题,详情访问:@ConstructorBinding注解的使用

第三方类绑定

如果我们需要将配置参数映射绑定到第三方依赖内提供的JavaBean,我们该使用什么方式呢?由于接收参数的类并不是我们自己编写的,所以没有办法对.class文件源码进行修改。

这时我们可以将第三方提供的JavaBean交给IOC容器托管,然后结合@ConfigurationProperties注解来映射绑定配置参数,使用方式如下所示:

@Bean
@ConfigurationProperties(prefix = SYSTEM_CONFIG_PREFIX)
public SystemConfig systemConfig() {
    return new SystemConfig();
}

这种方式也需要第三方提供的JavaBean有映射字段的Setter方法,否则无法进行赋值。

我们知道通过@Bean注解修饰的方法,会将方法的返回值加入到IOC容器内,那我们在使用配置时,直接注入配置映射类就可以了。

总结

上面这几种配置绑定方式都遵循OOP实现,当然如果你只需要获取一个配置参数,使用@Value也是一个好的选择,没有更好,只有更合适,根据每一种绑定方式的特点合理的选择一个合适业务的方式。

作者个人 博客 使用开源框架 ApiBoot 助你成为Api接口服务架构师

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot使用@ConstructorBinding注解进行配置属性绑定

    SpringBoot2.2版本发行后一些新的功能也渐渐的浮出了水面,在之前版本SpringBoot的配置文件与类之间的属性绑定(@ConfigurationPr...

    恒宇少年
  • 第四十九章:SpringBoot2.0新特性 - 你get到WebMvcConfigurer两种配置方式了吗?

    恒宇少年
  • 第二十一章:SpringBoot项目中的全局异常处理

    恒宇少年
  • SpringBoot上传文件到七牛云

    七牛云上传必要的配置有:accessKey、secretKey、bucket 其中accessKey、secretKey在该网址可查看

    Johnson木木
  • .Net中的反射(反射特性) - Part.3

    可能很多人还不了解特性,所以我们先了解一下什么是特性。想想看如果有一个消息系统,它存在这样一个方法,用来将一则短消息发送给某人:

    张子阳
  • 设计模式- 状态模式

    cwl_java
  • 注解@Repeatable详解

    在1.8之前,如果想多次使用一个注解进行描述,是如何完成的呢?举个例子,使用一个ReviewRecord注解来描述相关类、方法的Review信息。

    孟君
  • 禅与奶罩识别艺术(上)

    在昨天的卷积:如何成为一个很厉害的神经网络 - 知乎专栏中,热心网友提出了这样的问题: ? 该文在卷积神经网络的构成上讲解的比较直观,但是没有深入地探讨数学原理...

    AI研习社
  • StackOverflow上高赞问题:为什么处理一个排序数组要比非排序数组快的多

    今天,我们一起看几个 StackOverflow 上关于 Java 的几个高赞答案。

    业余草
  • PL/SQL Developer中文版下载以及使用图解(绿色版)

    下载地址:http://pan.baidu.com/s/1eQCTmkM 1、运行plsqldev.exe程序; 2、设置Oracle主目录名/OCI库地址,如...

    Java中文社群_老王

扫码关注云+社区

领取腾讯云代金券