Spring Boot 配置元数据

Spring Boot jar包包含配置元数据, 该配置元数据提供了所有配置的属性的详细信息。在我们编写application.yml或者application.properties文件时,会起到帮助作用。

如果在相应的类里面添加@ConfigurationProperties注解,在编译时会生成配置元数据文件。

本文参考的是Spring Boot 2.1.3.RELEASE的官方文档。

元数据格式

配置元数据是存放在/META-INF/spring-configuration-metadata.json。请看下面的json数据:

{"groups": [
    {
        "name": "server",
        "type": "org.springframework.boot.autoconfigure.web.ServerProperties",
        "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    },
    {
        "name": "spring.jpa.hibernate",
        "type": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate",
        "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties",
        "sourceMethod": "getHibernate()"
    }
],"properties": [
    {
        "name": "server.port",
        "type": "java.lang.Integer",
        "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    },
    {
        "name": "server.address",
        "type": "java.net.InetAddress",
        "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    },
    {
          "name": "spring.jpa.hibernate.ddl-auto",
          "type": "java.lang.String",
          "description": "DDL mode. This is actually a shortcut for the \"hibernate.hbm2ddl.auto\" property.",
          "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate"
    }
],"hints": [
    {
        "name": "spring.jpa.hibernate.ddl-auto",
        "values": [
            {
                "value": "none",
                "description": "Disable DDL handling."
            },
            {
                "value": "validate",
                "description": "Validate the schema, make no changes to the database."
            },
            {
                "value": "update",
                "description": "Update the schema if necessary."
            },
            {
                "value": "create",
                "description": "Create the schema and destroy previous data."
            },
            {
                "value": "create-drop",
                "description": "Create and then destroy the schema at the end of the session."
            }
        ]
    }
]}

1.properties

在每一个配置项(properties标签里面的元素)里面都会有一个具体的值,例如:

server.port=9090
server.address=127.0.0.1

2.group

分组(group标签里面的元素)项没有具体的值,表示多个属性归为一个组以及相应的配置类。

3.hints

hints这个标签是为了帮助用户进行编写配置文件。相当于这个属性的值为枚举,一一列出来。

分组属性

Name Type Purpose
name String 分组名称,必须要有
type String 分组数据类型的类名
description String 对这个分组进行简单介绍
sourceType String 从那个类中可以获取这些属性(org.springframework.boot.autoconfigure.web.ServerProperties)
sourceMethod String 从那个方法中可以获取这些属性(getHibernate())

分组属性

Name Type Purpose
name String 属性名称,必须要有
type String 属性的类型
description String 对属性的描述
sourceType String 指定属性的来源,或者说是可以在那个类中可以找到这些属性
defaultValue Object 属性的默认值
deprecation Deprecation 表明这个类属性是否已经废弃

deprecation中包含一下属性:

Name Type Purpose
level String 废弃的等级,如果是warning,表示在当前版本还可以使用,最好不要用;如果是error,就是在当前版本不可以使用这个属性
reason String 解释一下为什么废弃这个属性
replacement String 使用那个属性来替代这个已经过时的属性的全程

如果想要废弃某个属性,可以使用代码实现:

@ConfigurationProperties("app.acme")
public class AcmeProperties {

    private String name;

    public String getName() { ... }

    public void setName(String name) { ... }

    @DeprecatedConfigurationProperty(replacement = "app.acme.name")
    @Deprecated
    public String getTarget() {
        return getName();
    }

    @Deprecated
    public void setTarget(String target) {
        setName(target);
    }
}

上面代码的意思是将app.acme.target属性变成app.acme.name。

提示属性

Name Type Purpose
name String 要对那个属性进行提示
values ValueHint[] ValueHint对象列表
providers ValueProvider[] ValueProvider对象列表

values标签值介绍:

Name Type Purpose
value Object 提示一些有效值
description String 对属性值的描述

providers标签值介绍:

Name Type Purpose
name String 用于为提示引用的元素提供其他内容帮助的提供程序的名称
parameters json object 提供程序支持的任何其他参数

提供手动提示

为了提高用户的体验,并且帮助用户方便使用属性配置,需要添加附加元数据:1.潜在属性列表描述;2.关联提供者,将明确定义附加到属性。

值提示

如果属性的类型是Map,可以对key和value进行提示。例如下面:

@ConfigurationProperties("sample")
public class SampleProperties {

    private Map<String,Integer> contexts;
    // getters and setters
}
{"hints": [
    {
        "name": "sample.contexts.keys",
        "values": [
            {
                "value": "sample1"
            },
            {
                "value": "sample2"
            }
        ]
    }
]}

值提供者

支持的provider列表如下:

Name Description
any 允许提供的所有值
class-reference 使用target想要应用到那个类
handle-as 处理属性
logger-name 当项目中可用的包名和类名可以自动生成
spring-bean-reference 指定要导入的spring bean
spring-profile-name 指定要运行的环境

Any

如果provider设置的话,可以获取指定值的任何一个值。

{"hints": [
    {
        "name": "system.state",
        "values": [
            {
                "value": "on"
            },
            {
                "value": "off"
            }
        ],
        "providers": [
            {
                "name": "any"
            }
        ]
    }
]}

Class Reference

class-reference提供下面的参数:

Parameter Type Default value Description
target String none 用来选择值的类的全名
concrete boolean true 指定是否仅将具体类视为有效候选者

下面的代码就是指定server.servlet.jsp.class-name的具体类:

{"hints": [
    {
        "name": "server.servlet.jsp.class-name",
        "providers": [
            {
                "name": "class-reference",
                "parameters": {
                    "target": "javax.servlet.http.HttpServlet"
                }
            }
        ]
    }
]}

Handle As

handle-as提供者可以允许你将属性的类型替换为更高级别的类型。

提供的转换类型如下:

  • 任意java.lang.Enum:列出属性可能的值。
  • java.nio.charset.Charset:指定编码格式
  • java.util.Locale:指定时区
  • org.springframework.util.MimeType:支持的content-type
  • org.springframework.core.io.Resource:支持Spring资源的自动完成

指定liquibase的修改日志存放位置,使用org.springframework.core.io.Resource将值传递过去。

{"hints": [
    {
        "name": "spring.liquibase.change-log",
        "providers": [
            {
                "name": "handle-as",
                "parameters": {
                    "target": "org.springframework.core.io.Resource"
                }
            }
        ]
    }
]}

Logger Name

logger-name提供者自动补全loggername和loggergroup
下面的代码端就是介绍logger.level属性。Keys是logger名称,values可以自定义:

{"hints": [
    {
        "name": "logging.level.keys",
        "values": [
            {
                "value": "root",
                "description": "Root logger used to assign the default logging level."
            },
            {
                "value": "sql",
                "description": "SQL logging group including Hibernate SQL logger."
            },
            {
                "value": "web",
                "description": "Web logging group including codecs."
            }
        ],
        "providers": [
            {
                "name": "logger-name"
            }
        ]
    },
    {
        "name": "logging.level.values",
        "values": [
            {
                "value": "trace"
            },
            {
                "value": "debug"
            },
            {
                "value": "info"
            },
            {
                "value": "warn"
            },
            {
                "value": "error"
            },
            {
                "value": "fatal"
            },
            {
                "value": "off"
            }
        ],
        "providers": [
            {
                "name": "any"
            }
        ]
    }
]}

Spring Bean Reference

spring-bean-reference提供程序自动完成在当前项目中的配置中定义的bean。

下面的代码段表示spring.jmx.server属性使用MBeanServer bean的名称:

{"hints": [
    {
        "name": "spring.jmx.server",
        "providers": [
            {
                "name": "spring-bean-reference",
                "parameters": {
                    "target": "javax.management.MBeanServer"
                }
            }
        ]
    }
]}

在使用这个provider时候,需要使用ApplicationContext来获取相应的类

Spring Profile Name

激活在当前项目中定义的profile,代码段如下:

{"hints": [
    {
        "name": "spring.profiles.active",
        "providers": [
            {
                "name": "spring-profile-name"
            }
        ]
    }
]}

使用注解处理器来生成自己的元数据

如果想要生成自定义的元数据,可以添加相应的依赖包:

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

然后在相应的配置类里面添加@ConfigurationProperties注解。

对项目进行打包,解压相应的jar包,在META-INF中,可以看到spring-configuration-metadata.json文件。

关于如何自定义配置,请参考后续文章。

参考文章

Configuration Metadata

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容