Spring Boot 自定义配置元数据

news2024/11/26 8:18:36

Spring Boot 自定义配置元数据

概述

开发Spring Boot应用程序时, 可以把 application.properties文件中的配置属性直接转换为 Java Bean对象。这也是Spring Boot 约定大于配置的理念的体现,通过框架内置的各种属性按照不同的需求进行排列组合,满足特定的业务规则。

server.port=8090

上述配置,相信大家都很熟悉,Spring Boot中默认端口为 8080,可以上面配置将端口更改为 8090. 仔细思考一下,这里有几个细节值得学习:

  • 怎么样找到 Spring Boot 中所有的配置元数据
  • Spring Boot 中的配置元数据格式是怎么样的
  • 如何实现自定义的配置元数据

配置元数据

通常情况下,开发者期望应用程序在一定程度上可以配置,提高程序的灵活性。然而,很少有人能够真正的了解配置参数的作用,是否存在默认值,配置是否过期,属性名是否存在。

为了解决以上问题,Spring Boot 使用JSON文件生成配置元数据,为开发者提供了如何使用配置属性的有用信息。因此,配置元数据是一个描述性文件,其中包含了与配置属性相关的所需信息。

配置格式

使用Spring Boot 开发Web程序时,通常会直接依赖或者间接依赖各种jar文件,Spring Boot 2.7.5 版本为例,配置元数据位于spring-boot-autoconfig-2.7.5.jar里面的 META-INF/spring-configuration-metadata.json,

在这里插入图片描述

格式如下:

{"groups": [
    {
        "name": "server",
        "type": "org.springframework.boot.autoconfigure.web.ServerProperties",
        "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    }
    ...
],"properties": [
    {
        "name": "server.port",
        "type": "java.lang.Integer",
        "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    }
    ...
],"hints": [
    {
        "name": "spring.jpa.hibernate.ddl-auto",
        "values": [
            {
                "value": "none",
                "description": "Disable DDL handling."
            }
        ]
    }
]}

元数据文件中的每一个 property 可以指定一个默认的配置,如 server.port 的默认值为 8080。因此当开发者不配置 server.port 属性时,应用程序默认占用的端口为8080.

groups 是更高级别的项,它们本身并不指定属性值,而是为属性提供上下文分组。例如,server 分组,server.port 、server.address,端口、地址都是属于server组的一部分。

hints 属性经常用于帮助用户配置属性做出的提示。

Group 分组

NameTypePurpose
nameStringgroup分组名称,该属性必填
typeStringgroup的全类名(包含package)。例如,如果组基于用@ConfigurationProperties注释的类,则该属性将包含该类的完全限定名称。如果它基于@Bean方法,那么它将是该方法的返回类型。
descriptionStringGroup的简短描述。如果没有可用的描述,可以省略。建议说明采用简短的段落,第一行提供简洁的摘要。
sourceTypeStringgroup的全类名(包含package)。例如,如果组基于用@ConfigurationProperties注释的@Bean方法,则该属性将包含包含该方法的@Configuration类的完全限定名称。如果源类型未知,则可以省略该属性。
sourceMethodString方法全名称(包括括号和参数类型)(例如,@ConfigurationProperties注释@Bean方法的名称)。如果源方法未知,则可以省略。

Property Attributes

NameTypePurpose
nameString属性的全名。名称采用小写句点分隔形式(例如,server.address)。此属性是必需的。
typeString属性数据类型的完整签名(例如java.lang.String),也可以是完整的泛型类型(例如java.util.Map<java.lang.Sstring,com.example.MyEnum>)。您可以使用此属性指导用户输入的值类型。为了保持一致性,原语的类型通过使用其包装器对应项来指定(例如,布尔值变为java.lang.boolean)。注意,这个类可能是一个复杂类型,在绑定值时从String转换而来。如果类型未知,则可以省略。
descriptionString可向用户展示的property简短描述。如果没有可用的描述,可以省略。建议说明采用简短的段落,第一行提供简洁的摘要。
sourceTypeString提供此属性的源的类名。例如,如果属性来自用@ConfigurationProperties注释的类,则该属性将包含该类的完全限定名称。如果源类型未知,则可以省略。
defaultValueObject默认值,如果未指定属性,则使用该值。如果属性的类型是数组,则它可以是值的数组。如果默认值未知,则可以省略。
deprecationDeprecation指定该属性是否已弃用。如果该字段未被弃用或该信息未知,则可以省略该字段。

Hint Attributes

NameTypePurpose
nameString提示引用的属性的全名。名称采用小写句点分隔形式(如spring.mvc.servlet.path)。如果属性引用映射(例如system.contexts),则提示应用于映射的键(system.contents.keys)或映射的值(system.coontexts.values)。此属性是必需的。
valuesValueHint[]ValueHint对象定义的有效值列表(在下表中描述)。每个条目都定义了值,并且可能有描述。
providersValueProvider[]ValueProvider对象定义的提供者列表。

每个提示元素的值属性中包含的JSON对象可以包含下表中描述的属性

NameTypePurpose
valueObject提示引用的元素的有效值。如果属性的类型是数组,它也可以是值的数组。此属性是必需的。
descriptionString可向用户显示的值的简短描述。如果没有可用的描述,可以省略。建议说明采用简短的段落,第一行提供简洁的摘要。说明中的最后一行应以句点(.)结尾。

上面简单的介绍了配置元数据相关信息,一个关键点是JSON 格式的元数据文件是如何生成的?

Maven依赖

为了实现自动生成配置元数据文件,需要添加Maven依赖

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

该依赖让开发者在编译项目时,调用 Java 配置注解处理器。

配置元数据-Example

开发一个简单的Java Bean对象,并提供Get/Set方法

@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 声明,配置处理器会扫描使用该注解的类、方法,获取配置参数并生成配置元数据

生成配置元数据

使用maven 编译项目(Idea 工具自动生成),在 target/classes/META-INF目录下自动生成 spring-configuration-metadata.json 元数据配置文件

# 1. 删除 target
rm -rf target/

# 2. mvn 编译
mvn clean install -Dmaven.test.skip=true

在这里插入图片描述

spring-configuration-metadata.json文件内容如下

{
  "groups": [
    {
      "name": "database",
      "type": "com.springboot.study.springbootstudy.autoconfig.DatabaseProperties",
      "sourceType": "com.springboot.study.springbootstudy.autoconfig.DatabaseProperties"
    },
    {
      "name": "database.server",
      "type": "com.springboot.study.springbootstudy.autoconfig.DatabaseProperties$Server",
      "sourceType": "com.springboot.study.springbootstudy.autoconfig.DatabaseProperties",
      "sourceMethod": "getServer()"
    }
  ],
  "properties": [
    {
      "name": "database.password",
      "type": "java.lang.String",
      "sourceType": "com.springboot.study.springbootstudy.autoconfig.DatabaseProperties"
    },
    {
      "name": "database.server.ip",
      "type": "java.lang.String",
      "sourceType": "com.springboot.study.springbootstudy.autoconfig.DatabaseProperties$Server"
    },
    {
      "name": "database.server.port",
      "type": "java.lang.Integer",
      "sourceType": "com.springboot.study.springbootstudy.autoconfig.DatabaseProperties$Server",
      "defaultValue": 0
    },
    {
      "name": "database.username",
      "type": "java.lang.String",
      "sourceType": "com.springboot.study.springbootstudy.autoconfig.DatabaseProperties"
    }
  ],
  "hints": []
}

代码验证

  • 在application.properties 文件新增配置

    server.port=8090
    database.username=mysql
    
  • Spring Boot 启动类中 输出配置

    package com.springboot.study.springbootstudy;
    
    import com.springboot.study.springbootstudy.autoconfig.DatabaseProperties;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.web.ServerProperties;
    import org.springframework.context.ConfigurableApplicationContext;
    
    @SpringBootApplication
    public class SpringbootStudyApplication {
    
    	public static void main(String[] args) {
    		ConfigurableApplicationContext app = SpringApplication.run(SpringbootStudyApplication.class, args);
    		DatabaseProperties bean = app.getBean(DatabaseProperties.class);
    		ServerProperties server = app.getBean(ServerProperties.class);
    
    		System.out.println("通过配置属性获取  =================: " + app.getEnvironment().getProperty("database.username"));
    		System.out.println("通过bean属性获取 =================: " + bean.getUsername());
    		System.out.println("Spring Boot 内置属性装配 =================: " + server.getPort());
    	}
    }
    
  • 输出结果

通过配置属性获取  =================: mysql
通过bean属性获取 =================: mysql
Spring Boot 内置属性装配 =================: 8090

从输出结果可以分析出 无论是通过 Environment 还是通过bean都能够获取配置的值,且跟框架内置的属性配置方式一致,预期输出也一致。

  • 项目结构

    ├── HELP.md
    ├── mvnw
    ├── mvnw.cmd
    ├── pom.xml
    ├── springboot-study.iml
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   │   └── com
    │   │   │       └── springboot
    │   │   │           └── study
    │   │   │               └── springbootstudy
    │   │   │                   ├── SpringbootStudyApplication.java
    │   │   │                   └── autoconfig
    │   │   │                       └── DatabaseProperties.java
    │   │   └── resources
    │   │       ├── application.properties
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot Admin2 @EnableAdminServer的加载

其他相关文章&#xff1a; 1、Spring Boot Admin 参考指南 2、SpringBoot Admin服务离线、不显示健康信息的问题 首先根据官网的“快速开始”&#xff0c;快速搭建一个Spring Boot Admin Server项目 1、添加Spring Boot Admin启动器到依赖 pom.xml <dependency><grou…

低代码会使初级码农失业吗?

低代码的目的是提升效率&#xff0c;不是压榨生存空间。低代码不代表低技术&#xff0c;所以低代码并不会导致初级码农失业&#xff0c;实际上不仅不会导致失业&#xff0c;还帮助更多人走上了“开发者”岗位。 何为低代码&#xff1f; 所谓“低代码”&#xff08;Low-Code&a…

day29 SQL注入增删改查盲注延时布尔报错

前言 #知识点&#xff1a; 1、明确查询方式注入Payload 2、明确查询方式注入产生功能 3、明确SQL盲注延时&布尔&报错 #详细点&#xff1a; 盲注就是在注入过程中&#xff0c;获取的数据不能回显至前端页面。 此时&#xff0c;我们需要利用一些方法进行判断或者尝…

基于JAVA的房屋租赁系统平台【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86427640 租户在租房过程中如何才能保护自己的合法权益? 出租方在租房过程中又如何证明房屋的所属关系?种种租赁相关话题&#xff0c;成了当下关注的民生热点&#xff0c;为了切实解决人民群…

BUUCTF Reverse/[GXYCTF2019]simple CPP

BUUCTF Reverse/[GXYCTF2019]simple CPP 先看文件信息&#xff0c;是个64位的程序&#xff0c;且没有加壳 IDA64位打开 int __cdecl main(int argc, const char **argv, const char **envp) {bool v3; // si__int64 v4; // rax__int64 v5; // r8__int64 v6; // r8unsigned __in…

【ESP32_8266_MQTT篇】

文章目录MQTT介绍1 MQTT历史2 MQTT版本MQTT介绍 MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范&#xff0c;易于实现。这些特点使得它对很多场景来说都是很好的选择&#xff0c;特别是对于受限的环境如机器与机器的通信&…

Java面向对象的特点之:继承

对于继承&#xff0c;当大家看到这个词语的时候&#xff0c;在现实生活中&#xff0c;想必也会自然而然的想到了&#xff1a;继承家产&#xff1f;&#xff1f;那么&#xff0c;在Java的面向对象的时候&#xff0c;也存在这样的思想&#xff01;&#xff01; 下面笔者来带领大…

【ASM】字节码操作 工具类与常用类 LocalVariablesSorter 源码介绍以及原理介绍

文章目录 1.概述2. LocalVariablesSorter#2.1 class info2.2 fields2.3 constructors2.4 methods2.4.1 newLocal method2.4.2 local variables method3.工作原理3.1 添加新変量3.2处理旧变量4.总结1.概述 在上一节文章中:【ASM】字节码操作 工具类与常用类 LocalVar

深度学习入门——基于TensorFlow的鸢尾花分类实现(TensorFlow_GPU版本安装、实现)

基于TensorFlow的鸢尾花分类实现0 引言1 基本介绍和环境搭建1.1关于TensorFlow-GPU环境搭建第一步:安装Anaconda&#xff1a;第二步&#xff1a;安装GPU版本需要&#xff0c;明确显卡型号第三步&#xff1a;打开conda终端建立Tensorflow环境第四步&#xff1a;激活虚拟环境&…

最简单例子解释python的transpose函数

二维数组的transpose就是矩阵的转置&#xff0c;这里直接略过。直接讨论三维情况。 首先&#xff0c;我们要弄清楚transpose的轴是什么意思&#xff1f; 0是代表了第一个轴&#xff0c;1是代表了第二个轴&#xff0c;2是代表了第三个轴&#xff0c;这里我们用x&#xff0c;y&…

基于PHP+MySQL米步童鞋商城网站的设计与实现

随时时代的发展,更多的宝妈们希望给宝宝买鞋子的时候能够通过更加简单方便的方式来进行,因为宝妈每天都要面对很多的时候,不能够经常到商场闲逛,所以她们急需一种通过互联网的方式来购买童鞋,所以我们通过PHP语言和MySQL数据开发了米步童鞋商城网站 米步童鞋商城网站的主要功能…

认识JUC

JUC 一、Java JUC 简介 在 Java 5.0 提供了 java.util.concurrent &#xff08;简称 JUC &#xff09;包&#xff0c;在此包中增加了在并发编程中很常用 的实用工具类&#xff0c;用于定义类似于线程的自定义子 系统&#xff0c;包括线程池、异步 IO 和轻量级任务框架。 提供…

基于阈值预分割的区域生长分割法研究-含Matlab代码

⭕⭕ 目 录 ⭕⭕✳️ 一、引言✳️ 二、区域生长原理✳️ 三、基于阈值预分割的区域生长算法✳️ 四、确定生长准则✳️ 五、实验结果✳️ 六、参考文献✳️ 七、Matlab代码获取✳️ 一、引言 在区域分割处理技术之中&#xff0c;又包含有区域生长分割技术以及区域分裂合并分割…

车辆工程的入门学习

知乎 汽车控制需要了解的 汽车的行驶阻力与驱动力 做好汽车控制需要学什么 车辆控制工程 off-road vehicle 越野车 各智能系统介绍 制动防抱死系统&#xff08;anti-lock brake system, ABS&#xff09; 电子稳定性控制&#xff08;electronic stability control&#xff0c;…

SAP ADM100-1.1之SAP系统架构

一、SAP系统组成结构 SAP系统包括一个逻辑数据库、一个或多个实例。实例(也称为Central Instance中央实例)与数据库一起形成功能性的SAP系统。在每个SAP系统中都应该配置一个Central Instance中央实例。如果系统中仅有一个单实例那就存在“中央系统”,并且与它的数据库运行在…

上海亚商投顾:沪指冲高回落 中字头板块爆发领涨

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪沪指今日冲高回落&#xff0c;3100点得而复失&#xff0c;黄白二线分化严重&#xff0c;权重走强题材弱势&#xff…

[附源码]java毕业设计校园跑腿系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

深度学习入门(四十六)计算机视觉——区域卷积神经网络(R-CNN)系列

深度学习入门&#xff08;四十六&#xff09;计算机视觉——区域卷积神经网络&#xff08;R-CNN&#xff09;系列前言计算机视觉——区域卷积神经网络&#xff08;R-CNN&#xff09;系列课件R-CNN兴趣区域(RoI)池化层Faster R-CNNFaster R-CNNMask R-CNN精度和速度比较总结教材…

Maven基础学习——tomcat插件配置(含web工程配置)

tomcat插件配置一、前言二、步骤1.登录网站后搜索TomcatMaven2.找到插件坐标3.选择插件版本4.将插件配置到web工程中5.测试插件三、Web工程配置1.在webapp下新建文件2.删除web.xml中多余代码3.pom.xml文件一、前言 在学习Maven时&#xff0c;肯定会遇到tomcat插件&#xff0c;…

ESP8266--Arduino开发(驱动OLED显示文字和图片)

文章目录一、0.96 IIC OLED介绍二、安装库文件2.1、库屏幕控制相关API2.2、库绘制相关API2.3、文本相关API2.4、图像相关API三、显示字母四、显示汉字五、显示图片一、0.96 IIC OLED介绍 OLED是一种利用多层有机薄膜结构产生电致发光的器件&#xff0c;它很容易制作&#xff0…