1. 概览

在编写 Spring Boot 应用程序时,将配置属性映射到 Java bean 上是非常有用的。但是,记录这些属性的最好方法是什么呢?

在本教程中,我们将探讨 Spring Boot Configuration Processor关联的 JSON 元数据文件,该 JSON 文档记录每个属性的含义、约束等。

2. 配置元数据

作为开发人员,我们开发的大多数应用程序在某种程度上必须是可配置的。但是在通常情况下,我们并不能够真正的理解配置参数的作用,比如它有默认值,又或者是过时的,有时我们甚至不知道该属性的存在。

为了帮助我们理清楚,Spring Boot 生成了配置元数据的 JSON 文件,为我们提供关于如何使用属性的有用信息。所以,配置元数据是一个描述性文件,它包含与配置属性交互所需的必要信息。

这个文件的真正好处是IDE也可以读取它,从而为我们自动配置完成Spring属性以及其他配置提示。

3. 依赖

为了生成此配置元数据,我们将使用 spring-boot-configuration-processor 的依赖.

因此,让我们继续将依赖项添加为可选依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>2.1.7.RELEASE</version>
<optional>true</optional>
</dependency>

这种依赖关系将为我们提供在构建项目时调用的 Java 注解处理器。我们稍后会详细讨论这个问题。

为了防止 @ConfigurationProperties 不应用于我们的项目使用的其他模块,在 Maven 中添加依赖项为可选依赖 是最好的做法。

4. 配置属性示例

现在来研究处理器是怎么工作的,我们需要使用 Java bean 获取在 Spring Boot 应用程序中包含一些属性:

@Configuration
@ConfigurationProperties(prefix = "database")
public class DatabaseProperties { public static class Server {
private String ip;
private int port; // standard getters and setters
} private String username;
private String password;
private Server server; // standard getters and setters
}

要做到这一点,我们可以使用 @ConfigurationProperties 注解。配置处理器会扫描使用了此注解的类和方法,用来访问配置参数并生成配置元数据。

让我们将这些属性添加到属性文件中。在示例中,我们把文件命名为 databaseproperties-test.properties

#Simple Properties
database.username=baeldung
database.password=password

我们还将添加一个测试,以确保我们都做对了:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = AnnotationProcessorApplication.class)
@TestPropertySource("classpath:databaseproperties-test.properties")
public class DatabasePropertiesIntegrationTest { @Autowired
private DatabaseProperties databaseProperties; @Test
public void whenSimplePropertyQueriedThenReturnsPropertyValue()
throws Exception {
Assert.assertEquals("Incorrectly bound Username property",
"baeldung", databaseProperties.getUsername());
Assert.assertEquals("Incorrectly bound Password property",
"password", databaseProperties.getPassword());
} }

我们通过内部类 Server 还添加了嵌套属性 database.server.iddatabase.server.port我们应该添加内部类 Server 以及一个 server 的属性并且生成他的 getter 和 setter 方法。

在我们的测试中,让我们快速检查一下,确保我们也可以成功地设置和读取嵌套属性:

@Test
public void whenNestedPropertyQueriedThenReturnsPropertyValue()
throws Exception {
Assert.assertEquals("Incorrectly bound Server IP nested property",
"127.0.0.1", databaseProperties.getServer().getIp());
Assert.assertEquals("Incorrectly bound Server Port nested property",
3306, databaseProperties.getServer().getPort());
}

好了,现在我们准备使用处理器了。

5. 生成配置元数据

我们在前面提到过,配置处理器生成一个文件 – 它是使用注解处理实现的。

所以,在项目编译之后,我们将在目录 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": []
}

接下来,让我们看看更改 Java bean 上的注解如何影响元数据。

5.1. 关于配置元数据的其他信息

首先,让我们将 JavaDoc 注释添加到 Server 上.

第二,让我们给出一个 database.server.port 字段的默认值并最后添加 @Min@Max 注解:

public static class Server {

    /**
* The IP of the database server
*/
private String ip; /**
* The Port of the database server.
* The Default value is 443.
* The allowed values are in the range 400-4000.
*/
@Min(400)
@Max(800)
private int port = 443; // standard getters and setters
}

如果我们检查 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": "The IP of the database server",
"sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server"
},
{
"name": "database.server.port",
"type": "java.lang.Integer",
"description": "The Port of the database server. The Default value is 443.
The allowed values are in the range 400-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.ipdatabase.server.port 属性的不同之处。事实上,额外的信息是非常有帮助的。开发人员和 IDE 都更容易理解每个属性的功能。

我们还应该确保触发构建以获得更新的文件。在Eclipse中,如果选中“自动构建”选项,则每个保存操作都会触发一次构建。在 IntelliJ 中,我们应该手动触发构建。

5.2. 理解元数据格式

让我们仔细看看 JSON 元数据文件,并讨论其组成。

Groups 是用于分组其他属性的较高级别的项,而不指定值本身。在我们的例子中,我们有数据库组,它也是配置属性的前缀。我们还有一个 database 组,它是通过内部类把 IPport 属性作为一个组。

属性是可以为其指定值的配置项。这些属性配置在后缀为 *.properties或 .yml 文件中,并且可以有额外的信息,比如默认值和验证,就像我们在上面的示例中看到的那样。

提示是帮助用户设置属性值的附加信息。例如,如果我们有一组属性的允许值,我们可以提供每个属性的描述。IDE 将为这些提示提供自动选择的帮助。

配置元数据上的每个组成都有自己的属性。来解释配置属性的详细用法。

6. 总结

在本文中,我们介绍了 Spring Boot 配置处理器及其创建配置元数据的功能。使用此元数据可以更轻松地与配置参数进行交互。

我们给出了一个生成的配置元数据的示例,并详细解释了它的格式和组成。

我们还看到了 IDE 上的自动完成支持是多么有帮助。

与往常一样,本文中提到的所有代码片段都可以在我们的 GitHub 存储库找到。

原文:https://www.baeldung.com/spring-boot-configuration-metadata

作者:Dionis Prifti

译者:遗失的拂晓

Spring Boot 配置元数据指南的更多相关文章

  1. Spring Boot -- 配置切换指南

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  2. Spring Boot 配置优先级顺序

    一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...

  3. spring boot 配置注入

    spring boot配置注入有变量方式和类方式(参见:<spring boot 自定义配置属性的各种方式>),变量中又要注意静态变量的注入(参见:spring boot 给静态变量注入值 ...

  4. Spring boot配置多个Redis数据源操作实例

    原文:https://www.jianshu.com/p/c79b65b253fa Spring boot配置多个Redis数据源操作实例 在SpringBoot是项目中整合了两个Redis的操作实例 ...

  5. spring boot配置springMVC拦截器

    spring boot通过配置springMVC拦截器 配置拦截器比较简单, spring boot配置拦截器, 重写preHandle方法. 1.配置拦截器: 2重写方法 这样就实现了拦截器. 其中 ...

  6. spring boot配置mybatis和事务管理

    spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...

  7. [转] Spring Boot配置多个DataSource

    [From]  https://www.liaoxuefeng.com/article/001484212576147b1f07dc0ab9147a1a97662a0bd270c20000 Sprin ...

  8. Spring boot 配置异步处理执行器

    示例如下: 1. 新建Maven 项目 async-executor 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  9. Spring boot配置404、500页面

    Spring boot 配置404页面很简单,如果你访问的url没有找到就会出现spring boot 提示的页面,很明显Spring boot不用配置就可以显示404页面了. 在template下创 ...

随机推荐

  1. 设计模式(C#)——05适配器模式

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321       自然界有一条规则--适者生存.意思是生物要使用自然界的变化:在程序界中则需要新环境调用现存对象.那么,如何在新环境中 ...

  2. flutter无线调试与打包

    1.WIFI连接设备 设备打开开发者选项 -> 点击WIFI调试 ->  项目目录下输入终端命令: adb connect   设备ip地址:[端口号(一般是5555)] 2.apk打包 ...

  3. spring-cloud-kubernetes的服务发现和轮询实战(含熔断)

    本文是<spring-cloud-kubernetes实战系列>的第四篇,主要内容是在kubernetes上部署两个应用:Web-Service和Account-Service,通过spr ...

  4. Linux下Tomcat项目访问路径修改

    1.去除端口号8080. 首先,进入tomcat的安装目录下的conf目录,我的目录是 /usr/local/apache-tomcat-9.0.20/conf,编辑文件server.xml. 将se ...

  5. java设计模式5.组合模式、门面模式、享元模式、桥接模式

    组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...

  6. iOS Autoresizing Autolayout Size classes

    Autoresizing:出现最早,仅仅能够针对父控件做约束(注意:要关闭Autolayout&Size classes才能够看到Autoresizing) 代码对应: UIView.h中的a ...

  7. luogu -P1095 守望者的逃离 - 分别DP

    P1095 守望者的逃离: https://www.luogu.org/problemnew/show/P1095 题意: 有一个人要在S长度的直线上跑过去,初始有M的魔法值,用10点魔法值可以在一秒 ...

  8. Codeforces Round #385 (Div. 2) C - Hongcow Builds A Nation

    题目链接:http://codeforces.com/contest/745/problem/C 题意:给出n个点m条边,还有k个不能连通的点,问最多能添加几条边. 要知道如果有n个点最多的边是n*( ...

  9. Windows下安装youtube-dl(下载各大网站视频)

    youtube-dl干什么用的? 惯例,看官方介绍: youtube-dl is a command-line program to download videos from YouTube.com ...

  10. Springboot基于enable模块驱动

    enable作为模块驱动在Spring Farmework.Spring Boot.Spring Cloud使用,都是通过注解的形式以@enable作为前缀,一些常用注解如 | 框架 | 注解 | 模 ...