文档章节

Spring profile 多环境切换

super-will
 super-will
发布于 2017/05/19 08:10
字数 899
阅读 53
收藏 1

转:http://blog.lifw.org/post/68990012

spring允许我们通过定义 profile 来将若干不同的 bean 定义组织起来,从而实现不同环境自动激活不同的 profile 来切换配置参数的功能,下面介绍以 xml 的方式定义 profile、如何激活 profile以及定义默认的 profile,整个过程我以配置不同环境的数据源为例,为了简化配置,这里假设只有开发和生产两个环境。

 

数据源定义为

1

2

3

4

5

6

7

8

9

10

11

12

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

    <property name="user" value="${jdbc.user}" />

    <property name="password" value="${jdbc.password}" />

    <property name="jdbcUrl" value="${jdbc.jdbcUrl}" />  

    <property name="driverClass" value="${jdbc.driverClass}" />

    <property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>

    <property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>

    <property name="minPoolSize" value="${c3p0.minPoolSize}"/>

    <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>

    <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" />

    <property name="preferredTestQuery" value="${c3p0.preferredTestQuery}"/>

</bean>

classpath下外部资源文件有两个 settings-development.properties 和 settings-production.properties,分别是开发环境和生产环境的数据源配置参数,内容如下

 

settings-development.properties

1

2

3

4

5

6

7

8

9

10

jdbc.user=root

jdbc.password=111111

jdbc.driverClass=com.mysql.jdbc.Driver

jdbc.jdbcUrl=jdbc:mysql://localhost:3306/xxx

c3p0.minPoolSize=5 

c3p0.initialPoolSize=5

c3p0.acquireIncrement=5

c3p0.maxIdleTime=3600

c3p0.idleConnectionTestPeriod=3600

c3p0.preferredTestQuery=select 1

 

settings-production.properties

1

2

3

4

5

6

7

8

9

10

jdbc.user=xxx

jdbc.password=xxxx

jdbc.driverClass=com.mysql.jdbc.Driver

jdbc.jdbcUrl=jdbc:mysql:///xxx

c3p0.minPoolSize=20 

c3p0.initialPoolSize=20

c3p0.acquireIncrement=10

c3p0.maxIdleTime=3600

c3p0.idleConnectionTestPeriod=3600

c3p0.preferredTestQuery=select 1

 

 

1. 定义 profile

现在就可以通过定义 profile 来将开发和生产环境的数据源配置分开,这里我们定义两个 profile,一个名称是 development,另一个名称是 production

1

2

3

4

5

6

7

8

9

<!-- 开发环境配置文件 -->

<beans profile="development">

    <context:property-placeholder location="classpath:settings-development.properties"/>

</beans>

 

<!-- 生产环境配置文件 -->

<beans profile="production">

    <context:property-placeholder location="classpath:settings-production.properties"/>

</beans>

 

2. 定义默认 profile

默认 profile 是指在没有任何 profile 被激活的情况下,默认 profile 内定义的内容将被使用,通常可以在 web.xml 中定义全局 servlet 上下文参数 spring.profiles.default 实现,代码如下

 

1

2

3

4

5

<!-- 配置spring的默认profile -->

<context-param>

    <param-name>spring.profiles.default</param-name>

    <param-value>development</param-value>

</context-param>


3. 激活 profile 

spring 为我们提供了大量的激活 profile 的方法,可以通过代码来激活,也可以通过系统环境变量、JVM参数、servlet上下文参数来定义 spring.profiles.active 参数激活 profile,这里我们通过定义 JVM 参数实现。

在生产环境中,以 tomcat 为例,我们在 tomcat 的启动脚本中加入以下 JVM 参数

1

-Dspring.profiles.active="production"

而开发环境中不需要定义该参数,如果不定义,则会使用我们指定的默认 profile ,在这里也就是名称为 development 的 profile。这样当项目部署到不同的环境时,便可以通过 JVM 参数来实现不同环境 profile 自动激活。

 

4. 延伸

该参数还可以延伸,以至于我们可以在 java 代码中继续通过该参数来区分不同的环境,从而执行不同的操作,代码如下

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class Config {

      public static String ENV = "development";

}

public class InitConfigListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {

        //侦测jvm环境,并缓存到全局变量中

        String env = System.getProperty("spring.profiles.active");

        if(env == null) {

            Config.ENV = "development";

        } else {

            Config.ENV = env;

        }

    }

}

在项目初始化时获取到该参数后,我们便可以在项目任何位置使用,来执行一些不同环境需要区别对待的操作,例如统计流量的代码只需要在生产环境激活,就可以在jsp中加入如下代码

1

2

3

4

5

6

7

<!-- 生产环境统计、推送代码 -->

<c:if test="${env == 'production' }">

<script>

//统计代码

..

</script>

</c:if>

本文转载自:

super-will
粉丝 2
博文 28
码字总数 2484
作品 0
广州
程序员
私信 提问
springboot maven 多环境配置 jenking构建发布配置

在后端开发中,应用程序在不同的环境可能会有不同的配置,例如数据库连接、日志级别等,开发,测试,生产每个环境可能配置都不一致。 使用Spring Boot的Profile可以实现多场景下的配置切换,方...

Elson
2018/09/05
109
2
使用Spring Profile和Mybatis进行多个数据源(H2和Mysql)的切换

最近在做WebMagic的后台,遇到一个问题:后台用到了数据库,本来理想情况下是用Mysql,但是为了做到开箱即用,也整合了一个嵌入式数据库H2。这里面就有个问题了,如何用一套代码,提供对Mys...

黄亿华
2014/03/20
4.8K
3
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

TurboSanil
04/24
99
0
spring boot + maven使用profiles进行环境隔离

Spring Profile Spring可使用Profile决定程序在不同环境下执行情况,包含配置、加载Bean、依赖等。 Spring的Profile一般项目包含:dev(开发), test(单元测试), qa(集成测试), prod(生产环境)...

流浪的猪猪
2018/11/16
0
0
SpringBoot | 第五章:多环境配置

前言 写上一篇看英文资料,耗费了心力呀,这章,相对来说简单点。也比较熟悉,但是这很实用。不扯了,开始~ 多环境配置 在开发应用时,常用部署的应用是多个的,比如:开发、测试、联调、生产...

oKong
2018/07/15
640
3

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部