大家都知道在Spring应用中XML配置是比较繁琐的,而在Spring Boot中应用的配置就显得非常简便了,因为我们在POM中引入了模块化的Starter POMs
,而各个模块都是自己默认的配置,在上一遍应用中,我们甚至不需要使用任何配置就可以构建我们的Spring Boot应用。但是在日常开发中,因为项目的复杂性及场景的不同,我们就需要在Application中修改一些默认的配置和自定义属性配置,最常见的如:web属性、数据库连接、日志、缓存、模板以及多环境等。
Spring Boot配置方式及优先级
Spring Boot支持多种配置方式,各种配置方式的优先级不同,如下:(参考Spring Boot 属性配置和使用)
1. 命令行参数
2. 来自java:comp/env的JNDI属性
3. Java系统属性System.getProperties()
4. 操作系统环境变量
5. RandomValuePropertySource配置的random.*属性值
6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10. @Configuration注解类上的@PropertySource
11. 通过SpringApplication.setDefaultProperties指定的默认属性
本文只介绍常用的yml
和properties
配置方式,不对其他方式做详细介绍,感兴趣的同学可以阅读isea533大神的博客Spring Boot 属性配置和使用。
Spring Boot YAML配置
在Spring Boot中默认的配置是application.properties
,因为YAML格式的简洁、易读写性,使它成为是当下比较流行的一种数据格式,常用来写配置文件。这里我们也使用它来配置Spring Boot应用。如果.properties
和.yml
两种格式配置同时存在,由于优先级的不同,Spring Boot会使用默认的.properties
的配置。
Spring Boot常用配置
以下列举一部分项目中常用的属性配置。
application.yml
# web相关配置
server:
port: 80
context-path: /
address: 127.0.0.1
session:
timeout: 30
spring:
# 数据库连接
datasource:
url: jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
initial-size: 5
min-idle: 1
max-active: 20
test-on-borrow: true
# redis
redis:
# 服务器地址
host: 127.0.0.1
# 端口
port: 6397
# 密码
password:
# 连接超时时间(毫秒)
timeout: 0
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
# thymeleaf模板引擎
thymeleaf:
prefix: classpath:/templates/
content-type: text/html
mode: HTML5
cache: false
# 日志
logging:
config: classpath:logback.xml
file: log
level: debug
自定义属性配置及使用
在实际项目中,由于项目的复杂性,我们常常需要配置来控制环境的多样性,比如各网关地址、文件上传目录控制。相信大部分web项目都会用到上传文件功能,在上传文件中我们需要设置上传的文件存在的路径及访问http url,这里我们配置这两个属性。
在配置中,我们还可以使用变量${属性值}
的方式来使用已有的配置属性,比如我们在这里增加一个httpImageHost
属性来配置图片访问的url。
自定义属性配置
uploader:
path: /usr/upload
httpHost: http://127.0.0.1/
httpImageUrl: "${uploader.httpHost}image"
使用配置属性值
@ConfigurationProperties
:用于绑定指定前缀下配置的同类的属性值到实体类中属性上。@Value
:绑定单个配置属性值到类变量上。
这里我们需要创建一个用于装载配置值的类UploaderProperties
来接受配置文件中的值,然后使用@ConfigurationProperties
注解并设置prefix
,Spring Boot会自动把prefix
下面的属性给映射到对应的属性当中。也可使用@Value
注解为单个属性映射指定的配置值。然后再用@Component
注解将此类标识为Spring bean,便可以在需要的地方使用@Autowired
注入属性类,然后就可以使用它的属性啦。
UploaderProperties.java
package com.afei.study.springboot.property;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "uploader")
public class UploaderProperties {
// @Value("${uploader.path}")
private String path;
// @Value("${uploader.httpHost}")
private String httpHost;
private String httpImageUrl;
public String getHttpImageUrl() {
return httpImageUrl;
}
public void setHttpImageUrl(String httpImageUrl) {
this.httpImageUrl = httpImageUrl;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getHttpHost() {
return httpHost;
}
public void setHttpHost(String httpHost) {
this.httpHost = httpHost;
}
}
多环境配置
在实际项目开发中我们肯定会用到几个不同环境,比如:开发环境、测试环境、生产环境。在Spring Boot中多环境配置文件名需要按规范application-{profile}
命名,{profile}
就是对应不同的环境标识。常见的是:
1. application.yml:默认配置,配置通用内容及标识使用哪个环境。
2. application-dev.yml:开发环境配置
3. application-test.yml:测试环境配置
4. application-prod.yml:生产环境配置
具体的配置文件会被加载,需要在默认配置application.yml
文件中通过spring.profiles.active
属性来设置,其值对应{profile}值。如:
spring:
profiles:
active: dev
如果默认配置和我们使用的环境配置存在相同的属性,默认的配置将会被覆盖,可参考上面的配置文件优先级。我们可以使用java -jar
的方式来指定配置文件启动Spring Boot应用,只需要在java -jar xxx.jar
后面加上的spring.profiles.active={profile}
参数就可以指定配置文件启动了,这样子就可以不用重复修改默认配置文件了。