我們在引用spring官方start庫或者第三方start庫時(shí)盛险,在寫配置文件時(shí)idea總是能精準(zhǔn)的提示,并且鼠標(biāo)可以點(diǎn)過去看具體屬性或者類,而自己寫的配置文件idea只會有“Cannot resolve configuration property ...”這樣的提示性湿。
我們現(xiàn)在也去配置我們自己的配置文件讓idea知道這些配置文件是干什么的。
一满败、需要的注解
- @ConfigurationProperties 配置屬性文件肤频,需要指定前綴 prefix
- @EnableConfigurationProperties 啟用配置,需要指定啟用的配置類
- @NestedConfigurationProperty 當(dāng)一個(gè)類中引用了外部類算墨,需要在該屬性上加該注解
二宵荒、POM依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
三、配置類
@Data
public class School {
private Integer no;
private String name;
private String address;
}
@Data
@ConfigurationProperties(prefix = "jiuxian")
public class JiuxianProperties {
private String name;
private String nameCn;
private String nameEn;
private String[] hobbies;
private SexEnum sexEnum;
private boolean single;
private School school;
private City city;
enum SexEnum {
MAN, WOMAN
}
@Data
static class City {
private String no;
private String name;
}
}
這個(gè)時(shí)候@ConfigurationProperties(prefix = "jiuxian") 注解會報(bào)錯(cuò)not registered via @EnableConfigurationProperties or marked as Spring component净嘀。這需要加上@EnableConfigurationProperties就可以了
@EnableConfigurationProperties({ JiuxianProperties.class })
@SpringBootApplication
public class SpringbootYmlApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootYmlApplication.class, args);
}
}
四报咳、看效果
然后輸入 mvn clean package
這個(gè)時(shí)候properties和yml文件已經(jīng)可以提示了,不過有一些會有問題挖藏,比如jiuxian.school暑刃,這是一個(gè)對象,idea并不能解析,而因?yàn)镃ity對象是個(gè)內(nèi)部類是可以解析的膜眠。
如圖:如何處理呢岩臣?
只需要加上 @NestedConfigurationProperty注解即可
@NestedConfigurationProperty
private School school;
然后輸入命令 mvn clean package
警告消失(會有一點(diǎn)延遲)
五溜嗜、為什么
為什么一定要打包編譯后才可以呢?
看一下打包過后的結(jié)構(gòu)架谎,如圖:
idea之所以會代碼提示就是因?yàn)檫@個(gè)spring-configuration-metadata.json json文件炸宵。這個(gè)文件的生成依據(jù)的就是我們上面的配置。
六狐树、進(jìn)階配置
如果想在配置文件中能夠提示該字段描述焙压,以及該字段可選參數(shù),是否棄用等信息時(shí)抑钟,需要加額外的配置
1. 在resources目錄下新建META-INF文件夾涯曲,加一個(gè)additional-spring-configuration-metadata.json 配置文件
(1)該配置文件的節(jié)點(diǎn)信息
- groups 有以下屬性:
- name group的全名,該屬性必須
- type group數(shù)據(jù)類型的類名在塔。例如幻件,如果group是基于一個(gè)被@ConfigurationProperties注解的類,該屬性將包含該類的全限定名蛔溃。如果基于一個(gè)@Bean方法绰沥,它將是該方法的返回類型。如果該類型未知贺待,則該屬性將被忽略
- description 一個(gè)簡短的group描述徽曲,用于展示給用戶,要.點(diǎn)結(jié)尾麸塞。如果沒有可用描述秃臣,該屬性將被忽略
- sourceType 來源類名。例如哪工,如果組基于一個(gè)被@ConfigurationProperties注解的@Bean方法奥此,該屬性將包含@Configuration類的全限定名,該類包含此方法雁比。如果來源類型未知稚虎,則該屬性將被忽略
- sourceMethod 該組的方法的全名(包含括號及參數(shù)類型)。例如偎捎,被@ConfigurationProperties注解的@Bean方法名蠢终。如果源方法未知,該屬性將被忽略
"groups"是高級別的節(jié)點(diǎn)茴她,它們本身不指定一個(gè)值寻拂,但為properties提供一個(gè)有上下文關(guān)聯(lián)的分組。例如败京,server.port和server.servlet-path屬性是server組的一部分蛾茉。
注:不需要每個(gè)"property"都有一個(gè)"group"暇赤,一些屬性可以以自己的形式存在疟羹。
-
properties
- name 屬性全名,格式為小寫虛線分割的形式(jiuxian.name-en).必須要有的
- type 屬性數(shù)據(jù)類型,java.lang.Boolean。類型未知可忽略
- description 該屬性的描述
- sourceType 來源類型,例如妈拌,如果property來自一個(gè)被@ConfigurationProperties注解的類,該屬性將包括該類的全限定名埃儿。如果來源類型未知?jiǎng)t該屬性會被忽略
- defaultValue 定義輸入時(shí)的默認(rèn)值,只是提示截亦,并不是真正的默認(rèn)值,可忽略
- deprecated 是否廢棄 boolean 值
- level 級別 error,warning
- reason 廢棄原因
- replacement 替代屬性晶姊,為properties 全名
-
hints 可以給屬性提供可選的值扒接,以級描述
- name 屬性全名,不能為空
- values 可選的值
詳細(xì)看示例
{
"groups": [
{
"name": "jiuxian",
"sourceType": "com.jiuxian.config.JiuxianProperties",
"type": "com.jiuxian.config.JiuxianProperties"
},
{
"name": "jiuxian.school",
"sourceType": "com.jiuxian.config.School",
"type": "com.jiuxian.config.School",
"sourceMethod": "getSchool()"
}
],
"properties": [
{
"name": "jiuxian.name",
"sourceType": "com.jiuxian.config.JiuxianProperties",
"type": "java.lang.String",
"deprecation": {
"level": "error",
"reason": "replacement nameCn.",
"replacement": "jiuxian.name-cn"
}
},
{
"name": "jiuxian.name-cn",
"sourceType": "com.jiuxian.config.JiuxianProperties",
"type": "java.lang.String",
"defaultValue": "jiuxian"
}
],
"hints": [
{
"name": "jiuxian.sex-enum",
"values": [
{
"value": "man",
"description": "man."
},
{
"value": "woman",
"description": "woman."
}
]
},
{
"name": "jiuxian.single",
"values": [
{
"value": true,
"description": "yes."
},
{
"value": false,
"description": "no."
}
]
}
]
}
idea 提示:
(2) 如何廢棄某個(gè)字段们衙,可以用代碼來注解
@Deprecated
private String name;
@Deprecated
public String getName() {
return getNameCn();
}
@DeprecatedConfigurationProperty(replacement = "jiuxian.name-cn", reason = "replacement nameCn")
public void setName(String name) {
setNameCn(name);
}
七钾怔、更多詳細(xì)介紹請參閱官網(wǎng)
八、本文示例代碼
【注】以上代碼基于Springboot 2.0