写点什么

创建自定义的配置信息

作者:Wk
  • 2022 年 5 月 25 日
  • 本文字数:1699 字

    阅读完需:约 6 分钟

如何在应用程序中嵌入系统配置信息

我们知道 Spring Boot 通过自动配置机制内置了很多默认的配置信息,而在这些配置信息中,有一部分系统配置信息也可以反过来作为配置项应用到我们的应用程序中。

例如,如果想要获取当前应用程序的名称并作为一个配置项进行管理,那么很简单,我们直接通过 ${spring.application.name} 占位符就可以做到这一点,如下所示:

myapplication.name : ${spring.application.name}
复制代码

通过 ${} 占位符同样可以引用配置文件中的其他配置项内容,如在下列配置项中,最终“system.description”配置项的值就是“The system springcss is used for health”。

system.name=springcss
system.domain=health
system.description=The system ${name} is used for ${domain}.
复制代码

再来看一种场景,假设我们使用 Maven 来构建应用程序,那么可以按如下所示的配置项来动态获取与系统构建过程相关的信息:

info: 
  app:
    encoding: @project.build.sourceEncoding@
    java:
      source: @java.version@
      target: @java.version@
复制代码

上述配置项的效果与如下所示的静态配置是一样的:

info:
  app:
    encoding: UTF-8
    java:
        source: 1.8.0_31
        target: 1.8.0_31
复制代码

根据不同的需求,在应用程序中嵌入系统配置信息是很有用的,特别是在一些面向 DevOps 的应用场景中。

如何创建和使用自定义配置信息

在现实的开发过程中,面对纷繁复杂的应用场景,Spring Boot 所提供的内置配置信息并不一定能够完全满足开发的需求,这就需要开发人员创建并管理各种自定义的配置信息。例如,对于一个电商类应用场景,为了鼓励用户完成下单操作,我们希望每完成一个订单给就给到用户一定数量的积分。从系统扩展性上讲,这个积分应该是可以调整的,所以我们创建了一个自定义的配置项,如下所示:

springcss.order.point = 10
复制代码

这里,我们设置了每个订单对应的积分为 10,那么应用程序该如何获取这个配置项的内容呢?通常有两种方法。

使用 @Value 注解

使用 @Value 注解来注入配置项内容是一种传统的实现方法。针对前面给出的自定义配置项,我们可以构建一个 SpringCssConfig 类,如下所示:

@Component
public class SpringCssConfig {    @Value("${springcss.order.point}")
    private int point;}
复制代码

在 SpringCssConfig 类中,我们要做的就是在字段上添加 @Value 注解,并指向配置项的名称即可。

使用 @ConfigurationProperties 注解

相较 @Value 注解,更为现代的一种做法是使用 @ConfigurationProperties 注解。在使用该注解时,我们通常会设置一个“prefix”属性用来指定配置项的前缀,如下所示:

@Component
@ConfigurationProperties(prefix = "springcss.order")
public class SpringCsshConfig {
 
 private int point;
  
 //省略 getter/setter
}
复制代码

相比 @Value 注解只能用于指定具体某一个配置项,@ConfigurationProperties 可以用来批量提取配置内容。只要指定 prefix,我们就可以把该 prefix 下的所有配置项按照名称自动注入业务代码中。

我们考虑一种更常见也更复杂的场景:假设用户根据下单操作获取的积分并不是固定的,而是根据每个不同类型的订单会有不同的积分,那么现在的配置项的内容,如果使用 Yaml 格式的话就应该是这样:

springcss:
    points:
      orderType[1]: 10
      orderType[2]: 20
      orderType[3]: 30
复制代码

如果想把这些配置项全部加载到业务代码中,使用 @ConfigurationProperties 注解同样也很容易实现。我们可以直接在配置类 SpringCssConfig 中定义一个 Map 对象,然后通过 Key-Value 对来保存这些配置数据,如下所示:

@Component
@ConfigurationProperties(prefix="springcss.points")
public class SpringCssConfig {
 
    private Map<String, Integer> orderType = new HashMap<>();


 //省略 getter/setter
}
复制代码

可以看到这里通过创建一个 HashMap 来保存这些 Key-Value 对。类似的,我们也可以实现常见的一些数据结构的自动嵌入。

发布于: 刚刚阅读数: 4
用户头像

Wk

关注

还未添加个人签名 2022.05.24 加入

还未添加个人简介

评论

发布
暂无评论
创建自定义的配置信息_5月月更_Wk_InfoQ写作社区