在Spring Boot中使用配置元数据来配置您的配置

Spring Boot 1.3.0中发布了许多更新,但是其中一个对我很突出,因为我以前并不了解此更新,它的状态使其成为一项真正有用的功能(不幸的是,撰写本文时仅在Spring Boot中可用)这个)。 我正在谈论配置元数据以及与框架/应用程序这一领域相关的处理。 正如我将进一步演示的那样,有几种方法可以使用它,并且该框架还允许您利用自动化处理的好处。 如果您觉得自己需要解决这些问题,请不要担心–如果您想使用某些功能来精确调整设置,也可以使用手动输入的方法。 让我们谈谈配置。

Spring Boot中的配置元数据

面对现实吧-我们都去过那里。 您正在处理的应用程序必须是可配置的,但是,在涉及实际文档时,情况会有些奇怪。 团队通常有几种方法来处理这项艰巨的任务。 无论是在项目Wiki中对其进行描述和管理,还是在属性文件中部分注释,以Javadoc注释形式记录下来,或者根本不存在,我们都可以认为这与所需的事务状态相去甚远。 这涉及到一些挑战,例如使文档可供所有涉众使用(例如devops团队),版本控制和保持最新(尤其是不向后兼容的更新),或者只是弄清楚哪些选项可用或已弃用,以及它们对应用程序意味着什么。

项目设置

第一步是设置一切。 如前所述,您将需要使用Spring Boot 1.3.0或更高版本以及特殊依赖项,以确保重新编译包含元数据的文件,该文件稍后将由其他工具(如IDE)处理。 该工件称为spring-boot-configruation-processor ,应将其标记为optional

pom.xml中的Spring Boot依赖关系

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.1.RELEASE</version>
    <relativePath/>
</parent>
 
<dependencies>
    ...
 
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
 
    ...
</dependencies>

此设置的第二步是启用配置属性并实际创建一个包含它们的类。 这是一个相当简单的任务(尤其是如果您有使用Spring Boot的经验)。 我们将此类称为MyProperties

启用配置属性的配置类

@Configuration
@EnableConfigurationProperties({MyProperties.class})
public class ApplicationConfiguration {
 
    @Autowired
    private MyProperties myProperties;
 
    public MyProperties getMyProperties() {
        return myProperties;
    }
 
    public void setMyProperties(MyProperties myProperties) {
        this.myProperties = myProperties;
    }
}

开箱即用的配置元数据

MyProperties类反映以单词my开头的属性。 现在我们已经完成所有设置并准备就绪,让我们看一下该机制在两种最基本情况下如何工作。 考虑这两个配置属性–单个String属性( property )和使用enum值的属性( copyOption )。 这两个属性都是使用标准Javadoc进行描述的,如果使用StandardCopyOption ,则每个enum值都有其自己的Javadoc注释。 Spring Boots对配置元数据的支持尝试利用代码中的最大值,因为开发人员希望它能正确注释其配置属性(在enum的情况下非常有用且方便)。

样本配置属性类

@ConfigurationProperties(prefix = "my")
public class MyProperties {
 
    /**
     * String property used to configure my app.
     */
    private String property;
 
    /**
     * Configuration for file operations.
     */
    private StandardCopyOption copyOption;
 
    public String getProperty() {
        return property;
    }
 
    public void setProperty(String property) {
        this.property = property;
    }
 
    public StandardCopyOption getCopyOption() {
        return copyOption;
    }
 
    public void setCopyOption(StandardCopyOption copyOption) {
        this.copyOption = copyOption;
    }
    
}

现在该看魔术发生了。 前面提到的Spring依赖项可确保在项目构建期间生成元数据。 为了从整个设置中获得一些收益,您需要知道您的IDE如何支持此Spring Boot功能。 例如,据我所知,保存操作/事件上的Eclipse IDE触发了一个构建,该构建负责保持元数据为最新。 对于IntelliJ IDEA,由于没有保存/保存事件,您需要手动触发构建。 构建结束后,您可以浏览target文件夹(如果使用maven)并查找新添加的文件target\classes\META-INF\spring-configuration-metadata.json 。 给定上面的代码,您应该看到类似于以下内容:

target \ classes \ META-INF \ spring-configuration-metadata.json的内容

{
  "groups": [{
    "name": "my",
    "type": "com.jakubstas.s3downloader.MyProperties",
    "sourceType": "com.jakubstas.s3downloader.MyProperties"
  }],
  "properties": [
    {
      "name": "my.copy-option",
      "type": "java.nio.file.StandardCopyOption",
      "description": "Configuration for file operations.",
      "sourceType": "com.jakubstas.s3downloader.MyProperties"
    },
    {
      "name": "my.property",
      "type": "java.lang.String",
      "description": "String property used to configure my app.",
      "sourceType": "com.jakubstas.s3downloader.MyProperties"
    }
  ],
  "hints": []
}

现在,该文件可供读取和处理的工具使用,也可供团队成员检查以查看如何配置应用程序。 就是说,一旦我在IntelliJ IDEA编辑器中打开application.properties并开始为每个属性输入前缀,就会被熟悉的自动代码完成窗口所欢迎,该窗口具有我的每个属性用于什么的概念(基于在Javadoc注释上):

简单属性

对于enum属性,我还可以看到每个enum的值及其各自的Javadoc注释:

简单枚举属性

默认值选择

配置文档的最基本用例之一是为您的配置属性选择一个合理的默认值,以便尽可能容易地配置您的应用程序。 让我们看一下如何在此设置中实现这一目标。 为了允许任何手动输入spring-configuration-metadata.json file ,开发人员必须首先创建一个新的单独文件,然后由构建过程使用。 这是另一个名为Additional additional-spring-configuration-metadata.json json文件,应该在META-INF文件夹中创建,并且必须遵循附录B.配置元数据中描述的语法。

这样,一旦确定了默认值和可用选项(我想提供两个预定义的选项,但仍允许在String属性中使用任何其他String值),就可以使用以下内容创建该文件:

Additional-spring-configuration-metadata.json的内容

{
  "properties": [
    {
      "name": "my.copy-option",
      "type": "java.lang.String",
      "sourceType": "java.nio.file.StandardCopyOption",
      "defaultValue": "replace_existing"
    },
    {
      "name": "my.property",
      "defaultValue": "something"
    }
  ],
  "hints": [
    {
      "name": "my.property",
      "values": [
        {
          "value": "nothing",
          "description": "Does nothing."
        },
        {
          "value": "something",
          "description": "Does something."
        }
      ]
    }
  ]
}

这几乎可以达到预期的效果,并且已经可以在某些Spring Boot依赖项中看到。 对于String属性,两个选项均带有各自的描述。 默认选项已锁定。

默认字符串属性

enum属性的行为略有不同,因为IDE不会固定该选项,而是将其放在列表的顶部。

默认枚举属性

最后,让我们看一看尚未选择任何特定属性的内容。 在这种情况下,这两个属性均显示其对Javadoc的描述及其默认值。

默认属性

结论

这是对如何使配置更加出色的简短介绍。 这篇文章只是放弃了可能实现的目标,并且仍然设法显示出此功能的巨大潜力。 我鼓励您尝试一下此功能,亲自看看这种设置是否对您和您的团队都有效。 在下一篇文章中,我将详细介绍此配置支持。 敬请关注!

翻译自: https://www.javacodegeeks.com/2016/01/pimp-config-configuration-meta-data-spring-boot.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值