我们都知道,在企业开发过程中,一个项目往往都会有开发、测试、仿真、生产等环境配置,除了使用配置中心(比如Apollo等)之外,Spring Boot也提供了不同环境之间切换的机制,下面让我们来一起看看。
@Profile注解
@Profile注解用于标记某个bean在注册时,应该采用什么环境下面的配置信息,这里以数据库信息举例,我们分别创建一个开发环境、测试环境的数据源,其代码如下所示:
@Configuration
@Slf4j
public class ProFileAppConfig {
@Bean(value = "proFileAppConfigDev",destroyMethod = "close")
@Profile("dev")
public DataSource getDataSourceDev(){
Properties properties = new Properties();
properties.setProperty("driver","com.mysql.jdbc.Driver");
properties.setProperty("url","jdbc:mysql://zzm.zgj.cn.dev:3306/ZzmSpringBootLearn");
properties.setProperty("username","admin_dev");
properties.setProperty("password","admin_dev");
DataSource dataSource = null;
try {
dataSource = BasicDataSourceFactory.createDataSource(properties);
log.warn("创建DEV数据源成功");
}catch (Exception e){
log.warn("创建DEV数据源失败:", e);
}
return dataSource;
}
@Bean(value = "proFileAppConfigTest",destroyMethod = "close")
@Profile("test")
public DataSource getDataSourceTest(){
Properties properties = new Properties();
properties.setProperty("driver","com.mysql.jdbc.Driver");
properties.setProperty("url","jdbc:mysql://zzm.zgj.cn.test:3306/ZzmSpringBootLearn");
properties.setProperty("username","admin_test");
properties.setProperty("password","admin_test");
DataSource dataSource = null;
try {
dataSource = BasicDataSourceFactory.createDataSource(properties);
log.warn("创建TEST数据源成功");
}catch (Exception e){
log.warn("创建TEST数据源失败:", e);
}
return dataSource;
}
}
创建完毕后,还需要在application.properties配置文件中添加以下配置:
spring.profiles.active=dev
注意:spring会先检查spring.profiles.active配置是否存在,如果不存在,便不会启动profile机制
这里我们以开发环境举例,启动应用,可看到如下日志信息:
再将application.properties配置文件中修改以下配置:
spring.profiles.active=test
再次启动应用,可看到如下日志信息:
可见,通过spring.profiles.active的配置和@Profile注解共同配合,完成了不同环境之间的切换。
通过配置jvm启动参数来进行环境切换
jvm启动参数配置:-Dspring.profiles.active
在本地开发时,可以通过配置jvm启动参数来进行环境切换,这里以ideal举例;
开始之前,我们先准备两个配置文件,application-dev.properties和application-test.properties文件,用来分别存放开发、测试环境的数据库配置信息,如下所示:
database.driverName=com.mysql.jdbc.Driver
database.url=jdbc:mysql://zzm.zgj.cn.dev:3306/ZzmSpringBootLearn
database.userName=root_dev
database.password=123456_dev
database.driverName=com.mysql.jdbc.Driver
database.url=jdbc:mysql://zzm.zgj.cn.test:3306/ZzmSpringBootLearn
database.userName=root_test
database.password=123456_test
然后再创建数据源:
@Data
@Slf4j
@Component
public class ProFileDataBase {
private String driverName;
private String url;
private String userName;
private String password;
@Value("${database.driverName}")
public void setDriverName(String driverName) {
log.warn("ProFileDataBase:{}",driverName);
this.driverName = driverName;
}
@Value("${database.url}")
public void setUrl(String url) {
log.warn("ProFileDataBase:{}",url);
this.url = url;
}
@Value("${database.userName}")
public void setUserName(String userName) {
log.warn("ProFileDataBase:{}",userName);
this.userName = userName;
}
@Value("${database.password}")
public void setPassword(String password) {
log.warn("ProFileDataBase:{}",password);
this.password = password;
}
}
接下来以ideal举例,设置启动时的jvm参数:
启动应用,可以看到此时数据库配置成了开发环境的数据库:
再来试试测试环境的:
启动应用,可以看到此时数据库配置成了测试环境的数据库:
可见,我们完成了不同环境之间的切换。
好了,今天就先到这里了,眼过千遍不如手过一遍,赶紧去自己尝试一下吧。。。。拜拜