目录
前沿:
我们在日常开发的过程中一般会有不同的开发环境,测试环境、日常开发环境、预发环境、沙箱环境和线上环境等等,不同的环境一般配置是不同的,如果配置文件之一一个,每一个环境在开发过程中只能修改配置文件。这里以springboot为🌰说明profile的应用。
在日常的开发当中,我们经常会通过maven的profile来共同配合实现多环境的测试开发和部署工作。这里主要讲的是springboot中的profile实现配置的多环境。好了,又挖了两个坑。后面慢慢填。😂
TODO 配置是如何加载的
TODO maven的proflie
一个应用为了在不同的环境下工作,常常会有不同的配置有时代码逻辑处理也会不同。Spring Boot 对此提供了简便的支持。
springboot是根据 @profile和spring.profiles.active实现的
接下来详细说一下这些配置是如何使用的。
不同环境的区分
springboot的配置文件有多种格式
常见的是以.properties和.yml两种配置文件格式。
假设,一个应用的工作环境有:dev、test、prod分别说明
properties配置
那么,我们可以添加 4 个配置文件:
applcation.properties- 公共配置application-dev.properties- 开发环境配置application-test.properties- 测试环境配置application-product.properties- 生产环境配置
application-xx环境.properties
在 applcation.properties 文件中可以通过以下配置来激活 profile:
spring.profiles.active = test
spring.profiles.include属性
同时,在使用过程当中,我们还继续进行细分配置,如果一个配置文件的配置信息过多,想通过不同的文件区分不同的配置信息,例如ip-config进行ip地址的配置,common-config配置统一的信息,这时就增加了spring.profiles.include属性
application-dev-db-config.properties 存储ip信息
application-dev-log-config.properties 存储日志信息
我们可以在启用application-dev.properties开发环境(主)配置文件时,同时启用application-dev-db-config.properties和application-dev-log-config.properties文件。
开启方式为:
application.properties中激活dev环境
spring.profiles.active=dev
application-dev.properties中引入相关的dev的配置。使用application-dev.properties时自动就激活了dev-db-config、dev-log-config两个文件,不用再次指定。
spring.profiles.include=dev-db-config,dev-log-config
yml 配置
与 properties 文件类似,我们也可以添加 4 个配置文件:
applcation.yml- 公共的配置application-dev.yml- 开发环境配置application-test.yml- 测试环境配置application-product.yml- 生产环境配置
application-xx环境.yml
在 applcation.yml 文件中可以通过以下配置来激活 profile:
spring:
profiles:
active: prod
此外yml文件还有一个特殊的功能,就是能够把不同的环境在一个配置文件中配置出来,不同的环境之间通过---进行隔离
# 激活 product
spring:
profiles:
active: prod
# 也可以同时激活多个 profile
# spring.profiles.active: prod,proddb,prodlog
---
# dev 配置
spring:
profiles: dev
# 略去配置
---
spring:
profiles: test
# 略去配置
---
spring.profiles: prod
spring.profiles.include:
- proddb
- prodlog
---
spring:
profiles: proddb
# 略去配置
---
spring:
profiles: prodlog
# 略去配置
实战代码
使用 @Profile 注解可以指定类或方法在特定的 Profile 环境生效。
该注解能够对类、方法和注解使用
作用在类上:
@Configuration
@Profile("product")
public class DataConfig {
@Bean(destroyMethod="")
public DataSource dataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}
}
注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Profile("product")
@Document
public @interface Product {
}
方法
@Configuration
public class AppConfig {
@Bean("dataSource")
@Profile("dev")
public DataSource standaloneDataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:com/bank/config/sql/schema.sql")
.addScript("classpath:com/bank/config/sql/test-data.sql")
.build();
}
@Bean("dataSource")
@Profile("product")
public DataSource jndiDataSource() throws Exception {
Context ctx = new InitialContext();
return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
}
}
激活方式:
插件激活 profile
spring-boot:run -Drun.profiles=prod
jar 激活 profile
java -jar -Dspring.profiles.active=prod *.jar
启动时指定
在执行有参启动时,可以在命令中进行指定要选用的配置文件,例如:
java -jar xx.jar --spring.profiles.active=test
这个命令的优先级是最高的,即使application.properties中已经配置spring.profiles.active=dev,最终程序还是会用application-test.properties配置文件。
在 Java 代码中激活 profile
直接指定环境变量来激活 profile:
System.setProperty("spring.profiles.active", "test");
在 Spring 容器中激活 profile:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("development");
ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class);
ctx.refresh();
参考资料:
本文介绍了Spring Boot如何使用Profile进行多环境配置管理,包括properties和yml格式的配置文件,以及如何通过spring.profiles.active、spring.profiles.include属性激活和包含配置。还展示了如何在类和方法上使用@Profile注解,以及通过不同方式激活Profile,如启动参数、Java代码等。
610

被折叠的 条评论
为什么被折叠?



