SpringCloud入门之Spring Boot多环境配置切换指南
在 spring boot 中,有两种配置文件,一种是application.properties,另一种是application.yml,两种都可以配置spring boot 项目中的一些变量的定义,参数的设置等。
其中yml格式文件编写规范参考文章手把手学系列之YAML格式文件规范学习
一般在一个项目中,总是会有好多个环境。比如:
开发环境 -> 测试环境 -> 预发布环境 -> 生产环境
每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一点不同,配置读取可是一个让人有点伤脑筋的问题。
Spring Boot提供了一种优先级配置读取的机制来帮助我们从这种困境中走出来。
常规情况下,我们都知道Spring Boot的配置会从application.properties中读取。实际上,从resource目录下的application.properties文件读取是Spring Boot配置链中的一环而已。
根据Spring Boot的文档,配置使用的优先级从高到低的顺序,具体如下所示:
1. 命令行参数。
2. 通过 System.getProperties() 获取的 Java 系统参数。
3. 操作系统环境变量。
4. 从 java:comp/env 得到的 JNDI 属性。
5. 通过 RandomValuePropertySource 生成的“random.*”属性。
6. 应用 Jar 文件之外的属性文件(application.properties)。
7. 应用 Jar 文件内部的属性文件(application.properties)。
8. 在应用配置 Java 类(包含“@Configuration”注解的 Java 类)中通过“@PropertySource”注解声明的属性文件。
9. 通过“SpringApplication.setDefaultProperties”声明的默认属性。
这意味着,如果Spring Boot在优先级更高的位置找到了配置,那么它就会无视低级的配置。
方法一、不在配置文件写上配置节定义,而是通过执行时定位不同配置单独文件来区分。
比如,我在application.properties目录中,写入本地的MySQL的配置:
db.jdbc.driver=com.mysql.jdbc.Driver
db.jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8
db.jdbc.username=username
db.jdbc.password=password
在自己项目调试的阶段,项目总是会使用本地的MySQL数据库。而一旦打包之后,在外部声明一个test_evn.properties.
启动Jar包的时候, 指定一个外部配置文件:
java -jar demo.jar --spring.config.location=/path/test_evn.properties
这样一来,我们在开发者的机器上总是使用自己的配置,而一到对应的环境,就会使用高级的位置所做的配置。
方法二、在配置文件写上配置节定义,在执行时传递配置节需激活定义名称来区分。
1、在application.properties ,写法如下:
spring.profiles.active=dev
spring.datasource.data-username=root
spring.datasource.data-password=root
2、在yml 文件中配置的话,写法如下:
spring:
profiles:
active: prod
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test
username: root
password: root
启动Jar包的时候:Java -jar xxxxxx.jar spring.profiles.actiove=prod 也可以这样启动设置配置文件,但是这只是用于开发和测试
下面提供一个在同一文件中定义多个配置节的详细参考用例:
spring:
application:
name: config-server #一般情况下这部分应放在bootstrap.yml或bootstrap.properties文件中
---
#服务配置
spring:
profiles: config-server1
#应用配置
cloud:
config:
label: master #git label(提交id,分支名称或tag)
server:
git:
password: '' #登录密码
searchPaths: common-config #搜寻目录,可以配置多个,用逗号分割
uri: #仓库地址
username: '' #登录用户
#svn:
#uri: http://192.168.0.6/svn/repo/config-repo
#username: username
#password: password
#default-label: trunk
#profiles:
#active: subversion
server:
port: '8888'
#eureka服务注册地址
eureka:
client:
service-url:
defaultZone: http://server1:8761/eureka/,http://server1:8762/eureka/,http://server1:8763/eureka/
#instance:
#prefer-ip-address: true
---
#服务配置
spring:
profiles: config-server2
#应用配置
cloud:
config:
label: master #git label(提交id,分支名称或tag)
server:
git:
password: '' #登录密码
searchPaths: common-config #搜寻目录,可以配置多个,用逗号分割
uri: *** #仓库地址
username: '' #登录用户
#svn:
#uri: http://192.168.0.6/svn/repo/config-repo
#username: username
#password: password
#default-label: trunk
#profiles:
#active: subversion
server:
port: '8889'
#eureka服务注册地址
eureka:
client:
service-url:
defaultZone: http://server1:8761/eureka/,http://server1:8762/eureka/,http://server1:8763/eureka/
#instance:
#prefer-ip-address: true
启动Jar包的时候:
Java -jar xxxxxx.jar --spring.profiles.active=config-server1
Java -jar xxxxxx.jar --spring.profiles.active=config-server2
在代码中读取这些配置也是非常方便的,在代码的逻辑中,其实是无需去关心这个配置是从什么地方来的,只用关注能获取什么配置就够了。
public class ApplicationConfigure {
@Value("${db.jdbc.driver}")
private String jdbcDriver;
@Value("${db.jdbc.url}")
private String jdbcUrl;
@Value("${db.jdbc.username}")
private String jdbcUsername;
@Value("${db.jdbc.password}")
private String jdbcPassword;
// mysql config class
// .....
}
有时候我们在项目启动的时候,总是需要先启动一些初始化的类,以前比较常见的做法是写再static块中,Spring Boot提供了一个CommandLineRunner接口,实现这个接口的类总是会被优先启动,并优先执行CommandLineRunner接口中提供的run()方法。
public class ApplicationConfigure implements CommandLineRunner {
@Value("${db.jdbc.driver}")
private String jdbcDriver;
@Value("${db.jdbc.url}")
private String jdbcUrl;
@Value("${db.jdbc.username}")
private String jdbcUsername;
@Value("${db.jdbc.password}")
private String jdbcPassword;
// mysql config class
// .....
@Override
public void run(String... strings) throws Exception {
// 预先加载的一些方法,类,属性。
}
}
SpringCloud入门之Spring Boot多环境配置切换指南的更多相关文章
- 一分钟学会Spring Boot多环境配置切换
一. 问题由来 开发环境.测试环境.生产环境--------我们的软件在不同的环境中,系统参数和配置可能会不一样,比如数据源配置.日志文件配置.以及一些软件运行过程中的基本配置,那每次我们将软件部署到 ...
- 嗯,挺全乎儿的,Spring Boot 多环境配置都在这里了,你喜欢哪种?
持续原创输出,点击上方蓝字关注我 目录 前言 Spring Boot 自带的多环境配置 创建不同环境的配置文件 指定运行的环境 Maven 的多环境配置 创建多环境配置文件 定义激活的变量 pom 文 ...
- Spring Boot多环境配置
在项目开发阶段,开发环境和实际生产环境是不一样,比如使用的数据库/服务连接配置等.因此,配置多个开发环境profile还是必要的 多环境的配置(yml)方式 配置其实很简单,在resource目录下, ...
- cxf-rs 、spring 和 swagger 环境配置切换【github 有项目】
环境切换的目的是 准生产和生产环境切换时,只修改一个文件就可以达到效果 在spring bean 文件中 配置: <bean class="cn.zno.common.context. ...
- spring boot多环境配置 直接上代码
spring: profiles: active: test jackson: date-format: yyyy-MM-dd HH:mm:ss datasource: dri ...
- Spring Boot -- 配置切换指南
一般在一个项目中,总是会有好多个环境.比如: 开发环境 -> 测试环境 -> 预发布环境 -> 生产环境 每个环境上的配置文件总是不一样的,甚至开发环境中每个开发者的环境可能也会有一 ...
- Spring Boot的自动配置原理及启动流程源码分析
概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...
- Spring Boot 多环境如何配置
Spring Boot 开发环境.测试环境.预生产环境.生产环境多环境配置 通常一个公司的应程序可能在开发环境(dev).测试环境(test).生产环境(prod)中运行.那么是不是需要拷贝不同的安装 ...
- Spring Boot入门系列(十五)Spring Boot 开发环境热部署
在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译.然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是影响开发效率.其实Spring Boot的项目碰到这种情况, ...
随机推荐
- 2019.03.12 codeforces739E. Gosha is hunting(dp凸优化)
传送门 题意:nnn个物品,有aaa个XXX道具和bbb个YYY道具,XXX道具移走第iii个物品概率为pip_ipi,YYY道具移走第iii个道具概率为uiu_iui. 对于每个物品每种道具最多 ...
- 循环更新sqlserver数据库表ID
DECLARE @a INTDECLARE aaa CURSOR for select columnID from LNDB_COLUMN_INFO where columnID BETWEEN 22 ...
- MyBatis-Plus 3.0.3 Sql注入器添加,即全局配置Sql注入器,sqlInjector改写
官网上写着 但是,这个其实是2.0系列的写法,由于引用了最新的3.0.3这个功能基本不好使. 3.0.3版本的写法 也就是中间加了一层,原来是AutoSqlInjector,现在改为AbstractS ...
- C++ STL next_permutation(快速排列组合)
排列组合必备!! https://blog.csdn.net/bengshakalakaka/article/details/78515480
- 个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 2
接上篇:个人 WPF+EF(DBFirst) 简单应用开发习惯及EF学习测试(备忘) -- 1 Step1 在主程序中设置连接数据库 从Model类库的 App.Config 把数据库字符串拷贝出来, ...
- 从hadoop一路配置到spark
安装 jdk-8u131-linux-x64.gz scala-2.11.8.tgz hadoop-2.7.3.tar.gz spark-2.1.1-bin-hadoop2.7.tgz v ...
- 我的C#跨平台之旅(六):发布应用
由于此架构从一开始就将.NET Framework 的依赖降低到最低,且不依赖IIS,在ORM层面,完全实现代码优先,即真正做到数据库无关: Windows服务器部署: 在Windows应用服务器上安 ...
- Python爬虫的学习经历
在准备学习人工智能之前呢,我看了一下大体的学习纲领.发现排在前面的是PYTHON的基础知识和爬虫相关的知识,再者就是相关的数学算法与金融分析.不过想来也是,如果想进行大量的数据运算与分析,宏大的基础数 ...
- 架构(一)JDK安装
一 遇到的问题 问题1:安装jdk的时候,jdk解压失败? 我是通过wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b84 ...
- 搭建servlet+jsp环境
c3p0: <?xml version="1.0" encoding="UTF-8"?><c3p0-config> <named- ...