https://blog.csdn.net/l_sail/article/details/70142743
什么是profile
举个例子。一般在开发项目的时候要有多个环境,如开发环境、测试环境、生产环境,他们的配置文件一般不同。当我们要向各个环境发布程序时,需要人工处理这些配置文件,这显然麻烦且易错。有了profile,一切问题就简单了
简单讲profile就是一组配置,不同profile提供不同组合的配置,程序运行时可以选择使用哪些profile来适应环境。
对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单
多环境配置文件
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
- application-dev.properties:开发环境
- application-test.properties:测试环境
- application-prod.properties:生产环境
至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
如:spring.profiles.active=test就会加载application-test.properties配置文件内容
下面,以不同环境配置不同的服务端口为例,进行样例实验。
针对各环境新建不同的配置文件
application-dev.properties、application-test.properties
application-dev.properties文件内容为
server.port=8082
- 1
application-test.properties文件内容为
server.port=8083
- 1
在这三个文件均都设置不同的server.port属性,如:dev环境设置为8082,test环境设置为8083
用配置文件指定默认的环境
application.properties中设置spring.profiles.active=dev,就是说默认以dev环境设置
spring.profiles.active=dev
- 1
spring.profiles.active可以为数组,如
spring.profiles.active=dev,test
- 1
指定了多个环境
使用命令行激活
测试不同配置的加载:
- 执行java -jar xxx.jar,可以观察到服务端口被设置为8082,也就是默认的开发环境(dev)
- 执行java -jar xxx.jar –spring.profiles.active=test,可以观察到服务端口被设置为8083,也就是测试环境的配置(test)
使用编程的方式激活
SpringApplication的入口点也提供了一个用于设置额外配置的Java API(比如,在那些通过spring.profiles.active属性生效的配置之上):
package com.lf;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(Application.class, args);
applicationContext.getEnvironment().setActiveProfiles("dev");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
无条件的添加
spring.profiles.include属性可以用来无条件的添加生效的配置。
spring.profiles.include= proddb,prodmq
- 1
基于Java配置的profiles
Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。任何@Component或@Configuration都能被@Profile标记
@Configuration
@Profile("production")
public class ProductionConfiguration {
// ...
}
- 1
- 2
- 3
- 4
- 5
通过@ConfigurationProperties引用的文件亦可以被当作文件
来加载的。
总结
- application.properties文件是必定要加载的,而且是先加载的,无论是通过哪种方式指定的。
- 当加载完application文件之后才加载指定的profiles文件
- 如果application文件和指定的profile文件有相同的配置或冲突的配置项,则以profile中的为基准
- application文件中写通用的配置项,profile文件中写特定环境的配置项