文档章节

Spring Boot 配置元数据指南

liululee
 liululee
发布于 10/24 09:52
字数 1735
阅读 13
收藏 0

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

> 译者:遗失的拂晓


9月福利,关注公众号 ​ 后台回复:004,领取8月翻译集锦! ​ 往期福利回复:001,002, 003即可领取!

img

© 著作权归作者所有

liululee
粉丝 128
博文 78
码字总数 115177
作品 0
杭州
程序员
私信 提问
注册中心 eureka 和spring boot admin

官方文档对Spring-Boot-Admin安全的介绍 保护Spring Boot Admin Server 由于解决分布式Web应用程序中的身份验证和授权有多种方法,因此Spring Boot Admin不提供默认方法。 如果在依赖项中包含...

jxlgzwh
04/28
60
0
SpringBoot入坑指南之四:使用Spring Boot Admin进行服务监控

开篇 说个笑话:“你的代码没有Bug!”。 谁也不能保证自己的代码没有Bug,自己的代码能够100%满足业务性能要求,当线上的服务出问题后,如何快速定位问题、解决问题,这才是一个好程序猿的标...

centychen
02/13
173
0
Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!

Spring Boot 官网在 2019/03/15 这天发布了 Spring Boot 2.1.5 正式版,栈长表示真跟不上了。。 官宣如下 : https://spring.io/blog/2019/05/15/spring-boot-2-1-5-released 仓库也已经跟上...

Java技术栈
05/17
216
0
SpringBoot系列三:SpringBoot自定义Starter

原文出处:晴枫 在前面两章 SpringBoot入门 、SpringBoot自动配置原理 的学习后,我们对如何创建一个 SpringBoot 项目、SpringBoot 的运行原理以及自动配置等都有了一定的了解。如果我们系统...

晴枫
2018/11/21
0
0
Spring Boot入门资料整理

Spring Boot 初识 SpringBoot前世今生 本文主要讲述spring boot的由来,即其它诞生的背景,初衷,现状,及对未来的展望。 Spring Boot参考指南中文版--Chapter1.Spring Boot中文文档 本节提供...

小致dad
2017/11/07
554
0

没有更多内容

加载失败,请刷新页面

加载更多

交换两数(函数)

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> void Exchange(int* x, int* y){ int tmp = 0; tmp = *x; *x = *y; *y = tmp; } int main(){ int a; int b; scanf......

Lxxxxx256
12分钟前
2
0
给 K8s API “做减法”:阿里巴巴云原生应用管理的挑战和实践

作者 | 孙健波(天元) 阿里巴巴技术专家 本文整理自 11 月 21 日社群分享,每月 2 场高质量分享,点击加入社群。 早在 2011 年,阿里巴巴内部便开始了应用容器化,当时最开始是基于 LXC 技术...

阿里巴巴云原生
今天
6
0
数据平面

3.1数据平面的任务 解析数据包头 转发数据包到某些端口 通过查询由控制平面所生成的转发表 传统网络数据平面 数据包--输入端口---拆封和解析,转发策略匹配,转发调度---输出端口(协议相关,...

Firefly-
昨天
6
0
如何高效的阅读uni-app框架?(建议收藏)

作者 | Jeskson 来源 | 达达前端小酒馆 uni-app的框架,配置:page.json,manifest.json,package.json,vue.config.js。脚本,应用程序,main.js。日志打印,定时器,生命周期,页面,页面通...

达达前端小酒馆
昨天
7
0
实现原理专题--存储器的实现(三)

计算机实现原理专题--存储器的实现(二)中描述了一种电平触发器,但是某些应用需要在保持位从0到1变化的过程中对数据端进行保存。这种触发器叫边沿触发器。 一开始Q为0,时钟信号为0。当数据...

FAT_mt
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部