SpringBoot中使用Spring profile进行配置【谨慎使用,参见SpringBoot 2.4.0发布文档】
Spring profile是一种条件化的配置,在运行时,Spring根据哪些profile处于激活状态,可以使用或忽略不同的bean、配置类和配置属性。
⒈,定义方式
1.基于约定创建另外一个配置文件
文件名称要遵守如下约定: application-{profile名称}.yml or application-{profile名称}.properties,然后,我们就可以在文件中声明适用于该profile的配置属性了。
application-prod.yml
spring:
datasource:
url: jdbc:mysql://localhost/coreqi
username: fanqi
password: coreqi
logging:
level:
cn.coreqi: WARN
2.将特定profile的属性和非profile的属性都放到application.yml中【仅适用于YAML配置】
将特定profile的属性和非profile的属性都放到application.yml中,它们之间使用3个中划线进行分割,并且使用spring.profiles属性来命名profile。
logging:
level:
cn.coreqi: DEBUG #没有指定spring.profiles则这些属性是所有profile通用的
---
spring:
profiles: prod #指定了spirng.profiles则这些属性仅属于当前profile
datasource:
url: jdbc:mysql://localhost/coreqi
username: fanqi
password: coreqi
logging:
level:
cn.coreqi: WARN
⒉激活profile
1,在配置文件中激活【开发中常用】
spring:
profiles:
active: #可以激活一个,也可以激活多个
- prod
- audit
- ha
2,通过环境变量激活【生产环境中较常用】
export SPRING_PROFILES_ACTIVE=prod,audit,ha
3,如果以jar或war部署在servlet容器中,可以以命令行参数的形式设置激活的profile
java -jar coreqi.jar --spring.profiles.active=prod,audit,ha
*如果我们将Spring应用部署在Cloud Foundry中,将会自动激活一个名为cloud的profile。如果生产环境是Cloud Foundry,那么可以将生产环境相关的属性放到cloud profile下。
⒊通过profile条件化的创建bean
默认情况下,无论哪个profile处于激活状态,Java配置类中所声明的Bean都将被创建。
通过@Profile注解,可以将某些Bean声明为 仅在特定的profile为激活的状态下才会被创建。
@Bean @Profile("dev") //在dev模式下启动 public CommandLineRunner dataLoader(){ ... } @Bean @Profile({"dev","qa"}) //在dev or qa模式下启动 public CommandLineRunner dataLoader(){ ... } @Bean @Profile("!prod") //在非prod模式下启动 public CommandLineRunner dataLoader(){ ... }
@Profile注解,同时可以使用到配置类上。
@Configuration @Profile({"!prod","!qa"}) public class DevConfig { ... }