Spring Boot 2系列(二十): 配置文件加载及参数绑定
Spring Boot提倡的是零配置,提供了强大的自动配置功能;只要装配了相应的功能,默认就会启用通用的配置(习惯优于配置)。
但实际开发中,除了默认的配置外,根据需求难免需要定制配置文件;SpringBoot默认的配置文件application.properties
会被自动加载,但定制的配置文件则需要我们自己手动加载。
SpringBoot加载配置文件是将文件内容读取到Spring容器中,目的是为了给Spring容器中的上下文对象调用,达到一次加载,随处调用。
SpringBoot配置文件
Spring Boot可以自动识别yml 和 properties
两种文件,都是键值对(key/value)形式的配置;properties
可直接使用注解@PropertySource
加载自定义的文件;而yml
文件需要从代码层面加载,不如前者方便,但yml
是面向对象的一种格式,更易于理解。
默认的配置文件application.properties
随项目的(Maven)创建而存在在src/main/resources
目录中,会被自动加载。而我们自定义的配置文件,一般也放在些目录下,或在此目录建立子目录存放。
配置文件加载
公共配置文件
application.properties
文件也称为公共配置文件,在SpringBoot启动时被自动加载,优先级最高。
1 | 80 = |
定制配置文件
定制配置文件xxx.properties
文件,使用@PropertySource(value = "classpath:xxx.properties", encoding = "UTF-8")
注解加载,作用在类上,基于一次加载,到处使用原则,因一份配置文件可能有多种类型参数,或有多个配置文件,一般会建一个配置类,将加载配置文件的注解统一放在该配置类上。value
属性是个字符串数组,可以引入多个配置文件。
- mysql.properties
1
2
3
4#mysql.properties
mysql.url=http://localhost:3306
mysql.username=root
mysql.password=123456 - PropertiesConfig.java
1
2
3
4
5
6
7
8import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
public class PropertiesConfig {
}
备注:默认编码是ISO 8859-1
,故在默认的配置文件中使用中文时,会出现乱码,可以将中文转成Unicode编码或者使用yml
配置格式(默认就支持utf-8), 或在配置java类上利用@PropertySource
注解的 encoding
属性指定编码。
SpringBoot参数绑定
SpringBoot的参数绑定支持两种方式:
- 使用
@Value("${key}")
注解绑定每一项属性,每一项属性都要使用该注解。 - 使用
@ConfigurationProperties(prefix="xxx")
注解,匹配前辍,配置文件参数后辍与JavaBean的属性名一致,可实现批量自动绑定。
@Value绑定到属性
@Value
注解是将每一项参数绑定到属性上。
1 | @Value("${book.name}") |
属性前缀绑定到JavaBean
@ConfigurationProperties(prefix="xxx")
注解作用在实体为上,将实体类注册到Spring容器,需要用到该实体类时,通过@Autowired
注入到调用的类里。
- 实体类
在类上添加@Component
注解,将该类注册到到Spring容器,添加@PropertySource
注解加载定制配置文件。1
2
3
4
5
6
7
8
9
10
11
public class MysqlPro {
private String url;
private String account;
private String password;
//---set/get方法省略---
} - 定制配置文件:
src/main/resources/mysql.properties
- 在调用实体类的业务类里面注入实体类
Bean
。1
2
private MysqlPro mysqlPro;
Array/List 接收参数
Spring Boot配置文件还支持数组类型的参数绑定,接收属情实体类里有一个 数组或List类型的 hobby 属性,如下配置:
1 | # 方式一 |
可以使用 List<String>
获取取hobby的值。
Map 接收参数
接收属情实体类里有一个 Map 类型的 person 属性,如下示例
1 | # 方式一 |
@EnableConfigurationProperties
@ConfigurationProperties:作用在属性配置类上,可以通过prefix
指定前缀。
@EnableConfigurationProperties:表示指定的类(JavaBean)注册为 Spring 容器的 Bean,并注入到本类 。
当调用类通过**@EnableConfigurationProperties来注入@ConfigurationProperties**注解的属性类时,属性类可以省略@Component
或@Configuration
注解;调用类可以省略注入注解@Autowired
,属性类作为调用方的一个属性参数来使用。
查看Spring Boot的自动配置源码,此方式使用也是比较多的。
- 属性类,通过前缀注入值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15//省略@Component注解
public class RestServerProperties {
private String url;
public String getUrl() {
return url;
}
public RestServerProperties setUrl(String url) {
this.url = url;
return this;
}
} - 调用方
1
2
3
4
5
6
7
8
9
10
11
12
public class CallRemoteServiceImpl implements CallRemoteService {
private static final Logger logger = LogManager.getLogger(CallRemoteServiceImpl.class);
//省略@Autowired注解
private RestServerProperties restServerProperties;
//------方法--------------
}
调用使用@ConfigurationProperties
注解的JavaBean
时,在调用类上使用@EnableConfigurationProperties({xxxxProperties.class})
注解指定该JavaBean
需要注册为Spring容器的Bean
,即在调用前声明注册为Bean
,这样在JavaBean
上就不需要使用@Component
或@Configuration
注解。
生成随机数
Spring Boot的属性配置文件中可以通过${random}
来产生 int
值、 long
值或者 string
字符串,来支持属性的随机值。
1 | //随机字符串 |
Spring Boot 2系列(二十): 配置文件加载及参数绑定
http://blog.gxitsky.com/2018/06/25/SpringBoot-20-paramBindFromProperties/