在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;他们的定位基本都是…

.net:Code First 创建或更新数据库

控制台输入命令&#xff1a; 切换到项目的project.json 文件所在文件 dotnet ef migrations add XXX dotnet ef database update Visual Studio程序包管理器控制台&#xff1a; Add-Migration XXX Update-Database转载于:https://www.cnblogs.com/Cchblogs/p/7155781.html

jQuery实现数据映入form表单

jQuery实现数据映入form表单//显示用户信息 function show(type, yhdm) {return $.ajax({url: getUrlPath() /userManage / type,type: "POST",data: {"type": type, "yhdm": yhdm},dataType: json,success: function (data) {$(#yhid).val(d…

gin 生成api文档_gin-swagger 生成RESTful风格OpenAPI文档

&#x1f4dc;什么是swaggerSwagger 是一个 API 生成工具&#xff0c;可以生成文档。 Swagger 是通过编写 yaml 和 json 来实现文档化。并且可以进行测试等工作。通过 swagger 可以方便的生成接口文档&#xff0c;方便前端进行查看和测试。&#x1f527;安装 swagger在我们的项…

antlr 教程_ANTLR教程– Hello Word

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

VBA操作word生成sql语句

项目开始一般都是用word保存下数据库的文档 但是从表单一个一个的建表实在是很困难乏味&#xff0c;查查资料 1、可以生成一个html或者xml&#xff0c;检索结构生成sql。但是这个方式也蛮麻烦 2、查到vba可以操作word读取表格。所以采用这种方式写了一个小程序。这样就可以直接…

jQuery实现禁用和只读

jQuery实现禁用和只读<td class"tdTitle"><i class"required">*</i>用户ID</td><td class"tdCont"><input class"inputText noNull param" id"yhid" notNull"用户ID" name"…

idea 单独引入jar_Intellij IDEA 添加jar包的三种方式

一.直接复制&#xff1a;(不推荐)方法&#xff1a;直接将硬盘上的jar包复制粘贴到项目的lib目录下即可。注意&#xff1a;1.对于导入的eclipse项目&#xff0c;该方式添加的jar包没有任何反应&#xff0c;用make编译项目会报错2.对于在idea中创建的项目&#xff0c;该方式添加j…

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

service层拼接XML

service层拼接XML1.xml文件样式 <?xml version"1.0" encoding"UTF-8"?> <rows><userdata name"totalnumber">21</userdata><row id"1"><cell>1</cell><cell>案号</cell><…

蓝桥杯评分标准_蓝桥杯比赛要求

七、奖项设置及评选办法7.1省赛1.参赛选手奖省赛每个组别设置一、二、三等奖&#xff0c;比例分别为10%、20%、30%&#xff0c;总比例为实际参赛人数的60%&#xff0c;零分卷不得奖。省赛一等奖选手获得直接进入全国总决赛资格。所有获奖选手均可获得由工业和信息化部人才交流中…

Node.js 国产 MVC 框架 ThinkJS 开发 config 篇

原创&#xff1a;荆秀网 网页即时推送 https://xxuyou.com | 转载请注明出处 链接&#xff1a;https://blog.xxuyou.com/nodejs-thinkjs-study-config/ 本系列教程以 ThinkJS v2.x 版本&#xff08;官网&#xff09;为例进行介绍&#xff0c;教程以实际操作为主。 按模块定义配…

td 首行缩进_工作中常用的CSS整理

一、文本样式1. 文字超出部分显示省略号单行文本的溢出显示省略号(一定要有宽度)p{width:200rpx;overflow: hidden;text-overflow:ellipsis;white-space: nowrap;}多行文本溢出显示省略号p {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow…

sql分条件查询总数

sql分条件查询总数<select id"getTotalCount" resultType"java.lang.Integer">SELECT COUNT(1) FROM T_USER<where><if test"yhbm ! null">YHBM #{yhbm} ORDER BY PXH ASC</if><if test"yh ! null">YH…

java 接口 安全加密_Java中的安全加密

java 接口 安全加密上一次我写关于密码学的文章时 &#xff0c;我概述了Apache Shiro加密API&#xff0c;并展示了如何使用其两个对称密码。 我还写道&#xff1a;“您不需要在应用程序中加密和解密敏感数据的更多功能。” 我了解了更多有关密码的知识&#xff0c;发现您需要了…

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

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

qgraphicsitem 复制副本_QGraphicsItem:调用paint函数时

I am creating an animation with QGraphicsView, QGraphicsScene and QGraphicsItem. Can someone explain me when the paint function is called? Although I does not change variables of the item, the paint function is called every ≈100 ms. Can I stop that, so i…

怎么把两个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;…