SpringBoot通过properties实现多个数据库环境自动切换配置
记录一下
环境介绍
正常来说,一个软件的开发上线的流程大部分都是分为三个环境,依次是开发、测试、上线
1.开发环境(dev):
开发环境是指咱们本地跑的环境
2.测试环境(qa):
一般是克隆一份生产环境的配置,qa即test
3.生产环境(prod)
正式提供对外服务的,即是真实环境
关于SpringBoot如何通过多个properties实现数据库环境部署时自动切换配置的两种方式,部署时切换方式和打包时Maven控制方式
部署时切换
-
新增properties文件
在application.properties文件的同级目录依次创建application-dev.properties,application-qa.properties,application-pro.properties这三个配置文件,dev、qa和prod分别对应上文“环境介绍”中的三个环境
-
配置各个properties文件
在application.properties中添加配置切换选项,例如切换到dev环境的配置为:Spring.profiles.active=dev
依次在application-dev.properties,application-qa.properties,application-pro.properties配置相关datasource连接信息
-
部署测试环境(jar包部署)
部署时切换到qa环境
在不同的环境中怎么调用不同的文件
方式一、修改配置文件方式
在启动服务时,服务器就会通过application.yml文件去调用application-dev.yml文件,也就是说,在开发环境时,只需将application.yml配置文件配置为“dev“,而生产环境时,只需将”dev"改为”prod“就可以了
方式二、命令启动服务,命令中带参数方式(此方式可以没有application.yml文件)
1.第一步:进入到项目目录下,先用maven对项目进行打包,会在target目录下生成项目的jar包
2. 进入target目录,执行命令:java -jar 生成的jar包 --spring.profiles.active=prod
3. 项目就会调用application-prod.yml配置文件,即以生产环境的配置要求启动服务,同理,若是开发环境,只需将prod改为dev即可
SpringBoot最常用的3种读取properties配置文件
-
使用@Value注解读取
读取properties配置文件时,默认读取的时是application.properties
-
使用Environment读取
@RestController public class GatewayController { @Autowired private ConfigBeanValue configBeanValue; @Autowired private Environment environment; @RequestMapping(value = "/gateway") public String gateway() { return "get properties value by ''@Value'' :" + //1、使用@Value注解读取 " name=" + configBeanValue.name + " , age=" + configBeanValue.age + "<p>get properties value by ''Environment'' :" + //2、使用Environment读取 " , sex=" + environment.getProperty("demo.sex") + " , address=" + environment.getProperty("demo.address"); } }
-
使用@ConfigurationProperties注解读取
在实际项目中,当项目需要注入的变量值很多时,上述的两种方法工作量会变得比较大,这时候我们通常使用基于类型安全的配置方式,将properties属性和一个Bean关联一起,即使用注解@ConfigurationProperties读取配置文件数据
在src\main\resources下新建config.properties配置文件:
demo.phone=10086 demo.wife=self
创建ConfigBeanProp并注入config.properties中的值
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; @Component//表示将该类标识为Bean @ConfigurationProperties(prefix = "demo")//用于绑定属性,其中prefix表示所绑定的属性的前缀 @PropertySource(value = "config.properties")//表示配置文件路径 public class ConfigBeanProp { private String phone; private String wife; public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getWife() { return wife; } public void setWife(String wife) { this.wife = wife; } }
使用时,先使用@Autowired自动装载ConfigBeanProp,然后再进行取值
import cn.wbnull.springbootdemo.config.ConfigBeanProp; import cn.wbnull.springbootdemo.config.ConfigBeanValue; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class GatewayController { @Autowired private ConfigBeanValue configBeanValue; @Autowired private Environment environment; @Autowired private ConfigBeanProp configBeanProp; @RequestMapping(value = "/gateway") public String gateway() { return "get properties value by ''@Value'' :" + //1、使用@Value注解读取 " name=" + configBeanValue.name + " , age=" + configBeanValue.age + "<p>get properties value by ''Environment'' :" + //2、使用Environment读取 " sex=" + environment.getProperty("demo.sex") + " , address=" + environment.getProperty("demo.address") + "<p>get properties value by ''@ConfigurationProperties'' :" + //3、使用@ConfigurationProperties注解读取 " phone=" + configBeanProp.getPhone() + " , wife=" + configBeanProp.getWife(); } }