Spring Boot配置元数据方法教程
这篇文章主要介绍了SpringBoot配置元数据方法教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
前言
在编写SpringBoot应用程序时,将配置属性映射到Javabean上是非常有用的。但是,记录这些属性的最好方法是什么呢?
在本教程中,我们将探讨SpringBootConfigurationProcessor和关联的JSON元数据文件,该JSON文档记录每个属性的含义、约束等。
配置元数据
作为开发人员,我们开发的大多数应用程序在某种程度上必须是可配置的。但是在通常情况下,我们并不能够真正的理解配置参数的作用,比如它有默认值,又或者是过时的,有时我们甚至不知道该属性的存在。
为了帮助我们理清楚,SpringBoot生成了配置元数据的JSON文件,为我们提供关于如何使用属性的有用信息。所以,配置元数据是一个描述性文件,它包含与配置属性交互所需的必要信息。
这个文件的真正好处是IDE也可以读取它,从而为我们自动配置完成Spring属性以及其他配置提示。
依赖
为了生成此配置元数据,我们将使用spring-boot-configuration-processor的依赖.
因此,让我们继续将依赖项添加为可选依赖:
org.springframework.boot spring-boot-configuration-processor 2.1.7.RELEASE true
这种依赖关系将为我们提供在构建项目时调用的Java注解处理器。我们稍后会详细讨论这个问题。
为了防止@ConfigurationProperties不应用于我们的项目使用的其他模块,在Maven中添加依赖项为可选依赖是最好的做法。
配置属性示例
现在来研究处理器是怎么工作的,我们需要使用Javabean获取在SpringBoot应用程序中包含一些属性:
@Configuration @ConfigurationProperties(prefix="database") publicclassDatabaseProperties{ publicstaticclassServer{ privateStringip; privateintport; //standardgettersandsetters } privateStringusername; privateStringpassword; privateServerserver; //standardgettersandsetters }
要做到这一点,我们可以使用@ConfigurationProperties注解。配置处理器会扫描使用了此注解的类和方法,用来访问配置参数并生成配置元数据。
让我们将这些属性添加到属性文件中。在示例中,我们把文件命名为databaseproperties-test.properties:
#SimpleProperties database.username=baeldung database.password=password
我们还将添加一个测试,以确保我们都做对了:
@RunWith(SpringRunner.class) @SpringBootTest(classes=AnnotationProcessorApplication.class) @TestPropertySource("classpath:databaseproperties-test.properties") publicclassDatabasePropertiesIntegrationTest{ @Autowired privateDatabasePropertiesdatabaseProperties; @Test publicvoidwhenSimplePropertyQueriedThenReturnsPropertyValue() throwsException{ Assert.assertEquals("IncorrectlyboundUsernameproperty", "baeldung",databaseProperties.getUsername()); Assert.assertEquals("IncorrectlyboundPasswordproperty", "password",databaseProperties.getPassword()); } }
我们通过内部类Server还添加了嵌套属性database.server.id和database.server.port。我们应该添加内部类Server以及一个server的属性并且生成他的getter和setter方法。
在我们的测试中,让我们快速检查一下,确保我们也可以成功地设置和读取嵌套属性:
@Test publicvoidwhenNestedPropertyQueriedThenReturnsPropertyValue() throwsException{ Assert.assertEquals("IncorrectlyboundServerIPnestedproperty", "127.0.0.1",databaseProperties.getServer().getIp()); Assert.assertEquals("IncorrectlyboundServerPortnestedproperty", 3306,databaseProperties.getServer().getPort()); }
好了,现在我们准备使用处理器了。
生成配置元数据
我们在前面提到过,配置处理器生成一个文件–它是使用注解处理实现的。
所以,在项目编译之后,我们将在目录target/classes/META-INF下看到文件名为spring-configuration-metadata.json的文件:
{ "groups":[ { "name":"database", "type":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties" }, { "name":"database.server", "type":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties", "sourceMethod":"getServer()" } ], "properties":[ { "name":"database.password", "type":"java.lang.String", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties" }, { "name":"database.server.ip", "type":"java.lang.String", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server" }, { "name":"database.server.port", "type":"java.lang.Integer", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server", "defaultValue":0 }, { "name":"database.username", "type":"java.lang.String", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties" } ], "hints":[] }
接下来,让我们看看更改Javabean上的注解如何影响元数据。
关于配置元数据的其他信息
首先,让我们将JavaDoc注释添加到Server上.
第二,让我们给出一个database.server.port字段的默认值并最后添加@Min和@Max注解:
publicstaticclassServer{ /** *TheIPofthedatabaseserver */ privateStringip; /** *ThePortofthedatabaseserver. *TheDefaultvalueis443. *Theallowedvaluesareintherange400-4000. */ @Min(400) @Max(800) privateintport=443; //standardgettersandsetters }
如果我们检查spring-configuration-metadata.json文件,我们将看到这些额外的信息得到了反映:
{ "groups":[ { "name":"database", "type":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties" }, { "name":"database.server", "type":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties", "sourceMethod":"getServer()" } ], "properties":[ { "name":"database.password", "type":"java.lang.String", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties" }, { "name":"database.server.ip", "type":"java.lang.String", "description":"TheIPofthedatabaseserver", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server" }, { "name":"database.server.port", "type":"java.lang.Integer", "description":"ThePortofthedatabaseserver.TheDefaultvalueis443. Theallowedvaluesareintherange400-4000", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server", "defaultValue":443 }, { "name":"database.username", "type":"java.lang.String", "sourceType":"com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties" } ], "hints":[] }
我们可以找到database.server.ip和database.server.port属性的不同之处。事实上,额外的信息是非常有帮助的。开发人员和IDE都更容易理解每个属性的功能。
我们还应该确保触发构建以获得更新的文件。在Eclipse中,如果选中“自动构建”选项,则每个保存操作都会触发一次构建。在IntelliJ中,我们应该手动触发构建。
理解元数据格式
让我们仔细看看JSON元数据文件,并讨论其组成。
Groups是用于分组其他属性的较高级别的项,而不指定值本身。在我们的例子中,我们有数据库组,它也是配置属性的前缀。我们还有一个database组,它是通过内部类把IP和port属性作为一个组。
属性是可以为其指定值的配置项。这些属性配置在后缀为.properties或.yml*文件中,并且可以有额外的信息,比如默认值和验证,就像我们在上面的示例中看到的那样。
提示是帮助用户设置属性值的附加信息。例如,如果我们有一组属性的允许值,我们可以提供每个属性的描述。IDE将为这些提示提供自动选择的帮助。
配置元数据上的每个组成都有自己的属性。来解释配置属性的详细用法。
总结
在本文中,我们介绍了SpringBoot配置处理器及其创建配置元数据的功能。使用此元数据可以更轻松地与配置参数进行交互。
我们给出了一个生成的配置元数据的示例,并详细解释了它的格式和组成。
我们还看到了IDE上的自动完成支持是多么有帮助。
与往常一样,本文中提到的所有代码片段都可以在我们的GitHub存储库找到。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。