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 {@Autowiredprivate 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