Spring Boot jar包含元数据文件,提供所有支持的配置属性的详细信息。这些文件旨在允许IDE开发人员在用户使用application.properties 或application.yml文件时提供上下文帮助和“代码完成” 。
主要的元数据文件是在编译器通过处理所有被@ConfigurationProperties注解的节点来自动生成的。
配置元数据位于jars文件中的META-INF/spring-configuration-metadata.json,它们使用一个具有”groups”或”properties”分类节点的简单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"
},
{
"name": "server.servlet-path",
"type": "java.lang.String",
"sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
"defaultValue": "/"
}
...
]}
每个”property”是一个配置节点,用户可以使用特定的值指定它。例如,server.port和server.servlet-path可能在application.properties中如以下定义:
server.port=9090
server.servlet-path=/home
“groups”是高级别的节点,它们本身不指定一个值,但为properties提供一个有上下文关联的分组。例如,server.port和server.servlet-path属性是server组的一部分。
注:不需要每个”property”都有一个”group”,一些属性可以以自己的形式存在。
groups数组包含的JSON对象可以由以下属性组成:
名称 | 类型 | 目的 |
---|---|---|
name | String | group的全名,该属性是强制性的 |
type | String | group数据类型的类名。例如,如果group是基于一个被@ConfigurationProperties注解的类,该属性将包含该类的全限定名。如果基于一个@Bean方法,它将是该方法的返回类型。如果该类型未知,则该属性将被忽略 |
description | String | 一个简短的group描述,用于展示给用户。如果没有可用描述,该属性将被忽略。推荐使用一个简短的段落描述,第一行提供一个简洁的总结,最后一行以句号结尾 |
sourceType | String | 贡献该组的来源类名。例如,如果组基于一个被@ConfigurationProperties注解的@Bean方法,该属性将包含@Configuration类的全限定名,该类包含此方法。如果来源类型未知,则该属性将被忽略 |
sourceMethod | String | 贡献该组的方法的全名(包含括号及参数类型)。例如,被@ConfigurationProperties注解的@Bean方法名。如果源方法未知,该属性将被忽略 |
properties数组中包含的JSON对象可由以下属性构成:
名称 | 类型 | 目的 |
---|---|---|
name | String | property的全名,格式为小写虚线分割的形式(比如server.servlet-path)。该属性是强制性的 |
type | String | property数据类型的类名。例如java.lang.String。该属性可以用来指导用户他们可以输入值的类型。为了保持一致,原生类型使用它们的包装类代替,比如boolean变成了java.lang.Boolean。注意,这个类可能是个从一个字符串转换而来的复杂类型。如果类型未知则该属性会被忽略 |
description | String | 一个简短的组的描述,用于展示给用户。如果没有描述可用则该属性会被忽略。推荐使用一个简短的段落描述,开头提供一个简洁的总结,最后一行以句号结束 |
sourceType | String | 贡献property的来源类名。例如,如果property来自一个被@ConfigurationProperties注解的类,该属性将包括该类的全限定名。如果来源类型未知则该属性会被忽略 |
defaultValue | Object | 当property没有定义时使用的默认值。如果property类型是个数组则该属性也可以是个数组。如果默认值未知则该属性会被忽略 |
deprecated | boolean | 指定该property是否过期。如果该字段没有过期或该信息未知则该属性会被忽略 |
deprecation每个properties元素的属性中包含的JSON对象可以包含以下属性:
名称 | 类型 | 目的 |
---|---|---|
reason | string | 简短描述了该资源被弃用的原因。如果没有理由可以省略。建议描述是一个简短的段落,第一行提供简明扼要的摘要。说明中的最后一行应以period(.)结尾。 |
replacement | string | 正在替换此不推荐使用的属性的属性的全名。如果没有替换此属性,可以省略。 |
在Spring Boot 1.3之前,deprecated可以使用单个布尔属性来代替deprecation元素。这仍然以不推荐的方式支持,不应再使用。如果没有理由和替换可用,deprecation应该设置一个空的对象。
hints数组中包含的JSON对象可以包含以下属性:
名称 | 类型 | 目的 |
---|---|---|
name | 串 | 该提示引用的属性的全名。名称以小写虚构形式(例如server.servlet-path)。果属性是指地图(例如 system.contexts),则提示可以应用于map()或values()的键。此属性是强制性的system.context.keyssystem.context.values |
values | ValueHint | 由ValueHint对象定义的有效值的列表(见下文)。每个条目定义该值并且可以具有描述 |
providers | ValueProvider [] | 由ValueProvider对象定义的提供者列表(见下文)。每个条目定义提供者的名称及其参数(如果有)。 |
在同一个元数据文件中出现多次相同名称的”property”和”group”对象是可以接受的。例如,Spring Boot将spring.datasource属性绑定到Hikari,Tomcat和DBCP类,并且每个都潜在的提供了重复的属性名。这些元数据的消费者需要确保他们支持这样的场景。
为了改善用户体验并进一步协助用户配置给定的属性,您可以提供额外的元数据:
描述属性的潜在值列表。
关联一个提供者以将一个明确定义的语义附加到一个属性,这样工具就可以根据项目的上下文来发现潜在值的列表。
package com.lf.datasource;
import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* Created by LF on 2017/4/18.
*/
@ConfigurationProperties(prefix = "spring.druid")
public class DruidSource {
private String dbUrl;
private String username;
private String password;
private String driverClassName;
private int initialSize;
private int minIdle;
private int maxActive;
private int maxWait;
private int timeBetweenEvictionRunsMillis;
private int minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private boolean poolPreparedStatements;
private int maxPoolPreparedStatementPerConnectionSize;
private String filters;
private String connectionProperties;
public String getDbUrl() {
return dbUrl;
}
public void setDbUrl(String dbUrl) {
this.dbUrl = dbUrl;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDriverClassName() {
return driverClassName;
}
public void setDriverClassName(String driverClassName) {
this.driverClassName = driverClassName;
}
public int getInitialSize() {
return initialSize;
}
public void setInitialSize(int initialSize) {
this.initialSize = initialSize;
}
public int getMinIdle() {
return minIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public int getMaxActive() {
return maxActive;
}
public void setMaxActive(int maxActive) {
this.maxActive = maxActive;
}
public int getMaxWait() {
return maxWait;
}
public void setMaxWait(int maxWait) {
this.maxWait = maxWait;
}
public int getTimeBetweenEvictionRunsMillis() {
return timeBetweenEvictionRunsMillis;
}
public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
}
public int getMinEvictableIdleTimeMillis() {
return minEvictableIdleTimeMillis;
}
public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
}
public String getValidationQuery() {
return validationQuery;
}
public void setValidationQuery(String validationQuery) {
this.validationQuery = validationQuery;
}
public boolean isTestWhileIdle() {
return testWhileIdle;
}
public void setTestWhileIdle(boolean testWhileIdle) {
this.testWhileIdle = testWhileIdle;
}
public boolean isTestOnBorrow() {
return testOnBorrow;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public boolean isTestOnReturn() {
return testOnReturn;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public boolean isPoolPreparedStatements() {
return poolPreparedStatements;
}
public void setPoolPreparedStatements(boolean poolPreparedStatements) {
this.poolPreparedStatements = poolPreparedStatements;
}
public int getMaxPoolPreparedStatementPerConnectionSize() {
return maxPoolPreparedStatementPerConnectionSize;
}
public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
}
public String getFilters() {
return filters;
}
public void setFilters(String filters) {
this.filters = filters;
}
public String getConnectionProperties() {
return connectionProperties;
}
public void setConnectionProperties(String connectionProperties) {
this.connectionProperties = connectionProperties;
}
}
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>true optional>
dependency>
{
"hints": [],
"groups": [
{
"sourceType": "com.lf.datasource.DruidSource",
"name": "spring.druid",
"type": "com.lf.datasource.DruidSource"
}
],
"properties": [
{
"sourceType": "com.lf.datasource.DruidSource",
"name": "spring.druid.connection-properties",
"type": "java.lang.String"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"name": "spring.druid.db-url",
"type": "java.lang.String"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"name": "spring.druid.driver-class-name",
"type": "java.lang.String"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"name": "spring.druid.filters",
"type": "java.lang.String"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": 0,
"name": "spring.druid.initial-size",
"type": "java.lang.Integer"
},
{
"name": "spring.druid.initialSize",
"description": "Description for spring.datasource.initialSize.",
"type": "java.lang.String"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": 0,
"name": "spring.druid.max-active",
"type": "java.lang.Integer"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": 0,
"name": "spring.druid.max-pool-prepared-statement-per-connection-size",
"type": "java.lang.Integer"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": 0,
"name": "spring.druid.max-wait",
"type": "java.lang.Integer"
},
{
"name": "spring.druid.maxActive",
"description": "Description for spring.datasource.maxActive.",
"type": "java.lang.String"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": 0,
"name": "spring.druid.min-evictable-idle-time-millis",
"type": "java.lang.Integer"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": 0,
"name": "spring.druid.min-idle",
"type": "java.lang.Integer"
},
{
"name": "spring.druid.minIdle",
"description": "Description for spring.datasource.minIdle.",
"type": "java.lang.String"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"name": "spring.druid.password",
"type": "java.lang.String"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": false,
"name": "spring.druid.pool-prepared-statements",
"type": "java.lang.Boolean"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": false,
"name": "spring.druid.test-on-borrow",
"type": "java.lang.Boolean"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": false,
"name": "spring.druid.test-on-return",
"type": "java.lang.Boolean"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": false,
"name": "spring.druid.test-while-idle",
"type": "java.lang.Boolean"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"defaultValue": 0,
"name": "spring.druid.time-between-eviction-runs-millis",
"type": "java.lang.Integer"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"name": "spring.druid.username",
"type": "java.lang.String"
},
{
"sourceType": "com.lf.datasource.DruidSource",
"name": "spring.druid.validation-query",
"type": "java.lang.String"
}
]
}
```
#连接池的配置信息
## 初始化大小,最小,最大
spring.druid.initialSize=5
spring.druid.minIdle=5
spring.druid.maxActive=20
## 配置获取连接等待超时的时间
spring.druid.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.druid.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.druid.minEvictableIdleTimeMillis=300000
spring.druid.validationQuery=SELECT 1 FROM DUAL
spring.druid.testWhileIdle=true
spring.druid.testOnBorrow=false
spring.druid.testOnReturn=false
spring.druid.poolPreparedStatements=true
spring.druid.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.druid.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000