Spring Boot配置元数据方法教程

 更新时间:2019年12月05日 09:45:23   投稿:yaominghui  
这篇文章主要介绍了Spring Boot配置元数据方法教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Spring Boot配置元数据方法教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

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

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

配置元数据

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

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

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

依赖

为了生成此配置元数据,我们将使用 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 中添加依赖项为可选依赖 是最好的做法。

配置属性示例

现在来研究处理器是怎么工作的,我们需要使用 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.id 和 database.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());
}

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

生成配置元数据

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

所以,在项目编译之后,我们将在目录 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 上的注解如何影响元数据。

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

首先,让我们将 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.ip 和 database.server.port 属性的不同之处。事实上,额外的信息是非常有帮助的。开发人员和 IDE 都更容易理解每个属性的功能。

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

理解元数据格式

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

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

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

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

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

总结

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

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring动态添加定时任务的实现思路

    Spring动态添加定时任务的实现思路

    这篇文章主要介绍了Spring动态添加定时任务的实现思路,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • Spring AOP定义Before增加实战案例详解

    Spring AOP定义Before增加实战案例详解

    这篇文章主要介绍了Spring AOP定义Before增加,结合实例形式详细分析了Spring面向切面AOP定义Before增加相关定义与使用技巧,需要的朋友可以参考下
    2020-01-01
  • 详解Java中的Vector

    详解Java中的Vector

    Vector 可实现自动增长的对象数组。本文通过实例代码给大家详细介绍java中的vector,感兴趣的朋友一起看看吧
    2017-10-10
  • java stringbuffer的用法示例

    java stringbuffer的用法示例

    这篇文章主要介绍了java stringbuffer的用法示例,字符串缓冲区,是一个容器(当返回到的是String时而且长度不确定,数据类型不确定时就可以用StringBuffer)其实底层还是数组,只是被封装了,对外提供了方法,初始容量为16个字符
    2014-01-01
  • 详解java的四舍五入与保留位示例

    详解java的四舍五入与保留位示例

    本篇文章主要介绍了java的四舍五入与保留位示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java基础之Integer使用的注意事项及面试题

    Java基础之Integer使用的注意事项及面试题

    这篇文章主要给大家介绍了关于Java基础之Integer使用注意事项及面试题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • java反编译工具Bytecode-Viewer分享

    java反编译工具Bytecode-Viewer分享

    这篇文章主要介绍了java反编译工具Bytecode-Viewer分享,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java中List分片方式详细解析

    Java中List分片方式详细解析

    这篇文章主要介绍了Java中List分片方式详细解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • java软引用在浏览器使用实例讲解

    java软引用在浏览器使用实例讲解

    在本篇文章里小编给大家整理的是一篇关于java软引用在浏览器使用实例讲解内容,有兴趣的朋友们可以学习下。
    2021-04-04
  • Spring AOP实现声明式事务机制源码解析

    Spring AOP实现声明式事务机制源码解析

    这篇文章主要为大家介绍了Spring AOP实现声明式事务机制源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论