spring容器内建的profile功能实现开发环境、测试环境、生产环境配置自动切换

软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境、测试环境以及生产环境,通常这三个环境会有很多配置参数不同,例如数据源、文件路径、url等,如果每次上线一个新版本时都手动修改配置会十分繁琐,容易出错。spring 为我们提供了 profile 机制来解决这个问题。


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


数据源定义为


spring容器内建的profile功能实现开发环境、测试环境、生产环境配置自动切换

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

settings-development.properties

spring容器内建的profile功能实现开发环境、测试环境、生产环境配置自动切换

settings-production.properties

spring容器内建的profile功能实现开发环境、测试环境、生产环境配置自动切换

1. 定义 profile

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

spring容器内建的profile功能实现开发环境、测试环境、生产环境配置自动切换2. 定义默认 profile

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

spring容器内建的profile功能实现开发环境、测试环境、生产环境配置自动切换

3. ** profile 

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

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

spring容器内建的profile功能实现开发环境、测试环境、生产环境配置自动切换

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


4. 延伸

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