1、前言
Springboot项目配置properties或yaml文件时候,会有很多spring相关的配置提示。这个是如何实现的?如果我们自己的配置属性,能否也自动提示?
2、Springboot配置自动提示
其实IDE是通过读取配置信息的元数据而实现自动提示的。Springboot的元数据就在目录META-INF下。通过starter部分结构,我们可以看到如下:
其实,springboot自动提示元数据就在META-INF中的spring-configuration-metadata.json或additional-spring-configuration-metadata.json。
打开additional-spring-configuration-metadata.json可以看到json结构:
{
"groups": [],
"properties": [
{
"name": "spring.devtools.add-properties",
"type": "java.lang.Boolean",
"description": "Whether to enable development property defaults.",
"defaultValue": true
}
],
"hints": []
}
properties:为设置的提示属性,name为属性名称,type为属性类型,defaultValue为该属性默认值,description为属性描述。
groups:为properties提供了一个有上下文关联的分组。本身并不指定一个值。
hints:为属性设置多个提示值。
具体配置描述详见官网地址:https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html
3、手写尝试
1、创建starter工程
创建starter模块工程MySpringbootDemoModule1
2、自动装配
创建属性映射类,DemoProperties:
package org.example;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
@EnableConfigurationProperties({DemoProperties.class})
@ConfigurationProperties(prefix = "org.shamee")
public class DemoProperties {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
创建MyAutoConfiguration:
package org.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyAutoConfiguration {
@Bean
public DemoProperties demoProperties(){
return new DemoProperties();
}
}
配置spring.factories:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.example.MyAutoConfiguration
到此,一个简单的starter模块就已创建完毕,但是此时,如果直接使用,IDE是无法自动提示的。这里我们期望IDE帮我们自动提示DemoProperties中的两个属性,org.shamee.name和org.shamee.age。
3、创建元数据
那么,我们在resources下创建META-INF/additional-spring-configuration-metadata.json,并给与配置信息。
{
"properties": [
{
"name": "org.shamee.name",
"type": "java.lang.String",
"defaultValue": "test"
},
{
"name": "org.shamee.age",
"type": "java.lang.Integer",
"defaultValue": 12
}
]
}
4、安装使用
到此,就已经完成了一个能够让IDE自动帮我们提示的starter依赖。执行mvn install安装。
5、使用
创建一个主工程:MySpringbootDemo
pom.xml添加上述starter依赖。
刷新以来后,尝试application.properties上配置我们自定义的属性。
可以看到,IDE已经自动帮我们提示了属性名称以及默认的值。嗯,爽了。
看下starter依赖结构:
好了,又白嫖了一个无聊的小知识!!!😃😃😃