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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp实现数据禁用和只读

jsp实现数据禁用和只读

java事务不生效场景_讲一下,我最近帮忙面试的几个“高级”JAVA,真的心累

最近看了很多简历&#xff0c;很多候选人年限不小&#xff0c;但是想着也不能通过简历就直接否定一个人&#xff0c;何况现在大环境越来 越难&#xff0c;大家找工作也不容易&#xff0c;于是就打算见一见。在沟通中发现&#xff0c;由于年限不小&#xff0c;他们的定位基本都是…

antlr 教程_ANTLR教程– Hello Word

antlr 教程Antlr代表另一种语言识别工具。 该工具能够为任何计算机语言生成编译器或解释器。 除了明显的用途&#xff08;例如需要解析一种真正的“大型”编程语言&#xff0c;例如Java&#xff0c;PHP或SQL&#xff09;外&#xff0c;它还可以帮助执行更小&#xff0c;更常见的…

Java中使用ArrayList的10个示例–教程

Java中的ArrayList是HashMap之后最常用的集合类。 Java ArrayList表示一个可自动调整大小的数组&#xff0c;并用于代替数组。 由于创建数组后我们无法修改数组的大小&#xff0c;因此我们更喜欢在Java中使用ArrayList&#xff0c;一旦数组满了&#xff0c;它就会自动调整大小。…

[SoapUI] How to create a random UUID in each Request's Headers

${java.util.UUID.randomUUID()} is OK 转载于:https://www.cnblogs.com/MasterMonkInTemple/p/7159589.html

设置Tomcat管理员用户名和密码

http://dove19900520.iteye.com/blog/1774980 今天tomcat出点问题&#xff0c;然后我就想进入tomcat manager看看&#xff0c;结果怎么输入密码都不行&#xff0c;后来网上查了查才找到配置管理员用户名和密码的正确方式&#xff0c;在此记录一下&#xff1a; 要想配置管理员用…

怎么把两个div一左一右放

怎么把两个div一左一右放1.代码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><title>Title</title> </head> <body> <div style"width:150px;height:50px;margin:0;…

为Java + STANDARD值引入Cucumber

作为软件开发人员&#xff0c;我们都有最喜欢的工具来使我们成功。 许多人在上手时就很适合这份工作&#xff0c;但很快就不见了。 其他人则需要太多的设置和培训才能“将脚趾浸入水中”&#xff0c;只是为了找出自己是否是正确的工具即可。 Cucumber JVM是一个测试框架&#…

一个逼格很低的appium自动化测试框架

Github地址: https://github.com/wuranxu 使用说明 1. 安装配置Mongo数据库 下载地址 mongo是用来存放元素定位的&#xff0c;截图如下: 通过case_id区分每个case的元素定位 里面提供了value, method和text字段&#xff0c;分别作用是定位的值&#xff0c;定位的方法和要输入的…

Port already in use: 1099;

Port already in use: 1099;1.使用命令:netstat -aon|findstr 1099 找出占用1099端口的进程; 2.关闭占用该端口的进程:taskkill -f -pid 9336;

一款好用且免费的语句分析工具Plan Explorer

在调优过程中的查询语句优化阶段&#xff0c;分析语句的执行计划是必经之路&#xff0c;一款好的执行计划分析工具确实可以帮助我们事半功倍 小贴士&#xff1a;Plan Explorer是将Plan Explorer 专业版与免费版整合在一起发布的全新、完全免费版。微软的数据库专家和开发人员也…

前端如何发ModelAndView的请求

前端如何发ModelAndView的请求1.在Web.xml指定用作工具的跳转页面

带有Gluon Ignite和Dagger的JavaFX中的依赖注入

依赖注入抽象框架Gluon Ignite在几个流行的依赖注入框架&#xff08;例如Spring&#xff0c;Dagger和Guice&#xff09;上创建了一个通用抽象。 目前&#xff0c;Gluon 页面仅包含一个示例&#xff0c;该示例使用Gluon Ignite和Google Guice作为依赖注入框架&#xff0c;我想尝…

checkbox对齐排列

checkbox对齐排列<span style"width: 120px;display: inline-block"><lable><input type"checkbox"/></lable> </span>常用的 display 可能的值&#xff1a;

动态增删表单

动态增删表单1.实现效果 2.两种方式&#xff0c;推荐第二种&#xff08;不管是第一种还是第二种&#xff0c;想要序列化都必须&#xff0c;id不同&#xff09; &#xff08;1&#xff09;表单clone的方式&#xff08;简单演示&#xff0c;道理相通&#xff09; <div id&quo…

策略模式(组件协作模式)

策略模式&#xff08;组件协作模式&#xff09; 策略模式实例代码 注解 目的 正常情况下&#xff0c;一个类/对象中会包含其所有可能会使用的内外方法&#xff0c;但是一般情况下&#xff0c;这些常使用的类都是由不同的父类继承、组合得来的&#xff0c;来实现代码的复用&…

java11+osgi_错误学习:Java + OSGi

java11osgi最近&#xff0c;我致力于在OSGi环境中使Apache Hive工作。 虽然没有被证明是小菜一碟&#xff08;软件对吗&#xff1f;。。为什么我不感到惊讶&#xff1f; &#xff09;&#xff0c;它引导我解决了各种Java和OSGi错误。 在这里&#xff0c;我列出了其中一些让我有…

集群没有leader_ZooKeeper 集群中 Leader 与 Follower 的4种数据同步策略

首先要声明一点&#xff0c;zk集群中&#xff0c;leader服务器有着比较重要的存在&#xff0c;Follower 服务器只是处理非事务性请求&#xff0c;leader服务器主要负责事务性请求&#xff0c;Follower 服务器在遇到事务性请求以后还是会转发给leader服务器处理&#xff0c;所以…

JavaOne 2015:高级模块化开发

JavaOne 2015看到了Project Jigsaw团队关于Java 9中的模块化的一系列讨论 。它们都是非常有趣的&#xff0c;并且充满了宝贵的信息&#xff0c;我敦促每个Java开发人员都注意它们。 除此之外&#xff0c;我想给社区一种搜索和引用它们的方法&#xff0c;因此我在这里总结一下&…

action怎么获得 ajax date参数_ajax()gt;load()事件的新用法!!!

load()函数用于从服务器加载数据&#xff0c;并使用返回的html内容替换当前匹配元素的内容。load()函数默认使用GET方式&#xff0c;如果提供了对象形式的数据&#xff0c;则自动转为POST方式。load()函数只会替换每个匹配元素的内部内容(innerHTML)。你还可以在URL字符串后面追…