1.Profile 的概念
为了实现多环境配置需要使用profile,有两种profile:
(1)Spring Profile
Spring可使用Profile决定程序在不同环境下执行情况,包含配置、加载Bean、依赖等。
Spring的Profile一般项目包含:dev(开发), test(单元测试), qa(集成测试), prod(生产环境)。由spring.profiles.active属性
决定启用的profile。
(2)Maven Profile
Maven同样也有Profile设置,可在构建过程中针对不同的Profile环境执行不同的操作,包含配置、依赖、行为等。Maven的Profile由 pom.xml 的
2.Spring 配置Profile的实现方式
Spring boot为profile的配置提供了很好的支持,比如默认的application配置文件默认就支持按照profile使用对应的application-{profile}配置文件,非常方便。下面介绍两种方法:
(1) application.properties方式
SpringBoot的配置文件默认为 application.properties。不同Profile下的配置文件由application-{profile}.properties管理,同时独立的 Profile配置文件会覆盖默认文件下的属性。激活方式:
- 在application.properties文件中激活
spring.profiles.active=dev
- 运行jar包时激活
java -jar hello.jar --spring.profiles.active=test
或者
java -Dspring.profiles.active=test -jar hello.jar
(2)application.yml文件方式
只需要一个application.yml文件即可
spring:
profiles:
active: dev
---
spring:
profiles: dev
server:
port: 9001
---
spring:
profiles: test
server:
port: 9002
---
spring:
profiles: proc
server:
port: 9003
application.yml文件分为四部分,使用一组(---)来作为分隔符,第一部分,为通用配置部分,并指定使用的环境,表示三个环境都通用的属性
3.Maven Profile配置Profile的实现方式
上面的springboot的profile配置方式存在两点不足:
- 对配置文件路径和命名的约定, 造成了很大的不灵活性
- 把所有配置文件都打进jar包有点太粗暴,当然没有强迫症的不考虑。
这时候我们就可以结合maven profile 一起使用。具体步骤:
(1)配置Profile
//Maven的Profile配置了两个:dev和prod
dev
true
//profileActive:申明的属性,此处对应Spring的Profile值
dev
//dev中使用了内嵌Tomcat,而 prod 中没有
org.springframework.boot
spring-boot-starter-tomcat
org.apache.tomcat
tomcat-jdbc
prod
prod
(2)资源过滤配置
SpringBoot的 Profile选择需要在 application.properties中配置
,如果定死在文件,那么每次打包都需要手动修改,很麻烦,而且容易出错。Maven的资源过滤功能可以实现在构建时修改以“@xxx@”表示的属性。资源过滤需要在pom.xml的
//去掉src/main/resources下的所有application.properties文件
src/main/resources
application*.properties
//添加了application.properties默认配置文件和由profileActive属性决定的相应profile配置文件。
src/main/resources
true
application.properties
application-${profileActive}.properties
(3)Spring配置Profile
spring.profiles.active = @profileActive@
(4)构建
构建命令:
mvn clean package -Dmaven.test.skip=true -Pdev
4. 知识拓展- yaml语法
(1)语法要点:
- 缩进
需要每个缩进级别由两个空格组成。一定不能使用tab键 - 冒号
每个冒号后面一定要有一个空格(以冒号结尾不需要空格,表示文件路径的模版可以不需要空格) - 分割符
在一个文件中,可同时包含多个文件,并用"---"分隔。选择性的符号"..."可以用来表示文件结尾。在单一文件中,可用连续三个连字号(---)区分多个文件;
(2)获取配置文件值
使用@Value("${配置文件中的参数名}")获取值:
# mail配置
spring:
mail:
host: smtp.test.cn
port: 25
username:[email protected]
password: 1234
properties:
mail.smtp.auth: true
mail.smtp.starttls.enable: true
mail.smtp.starttls.required: true
//获取值
@Value("${spring.mail.username}")
private String from;