目录
一、场景
在软件开发过程中经常需要将应用程序从一个环境迁移到另一个环境中,比如从开发环境迁移到测试,再从测试发布至生产环境,而这些环境的数据库配置,加密算法甚至与其他系统的对接集成配置可能都是不一样的。若不希望每次迁移都重新修改配置,重新重新编译构建,则可以考虑使用 Spring 提供的 Profile 解决方案。
需要注意的是,Profile 并不是在构建时做出决策,而是在运行时才进行判断。这样便使得同一个部署单元(比如 WAR 文件)能够适用于所有的环境。
二、使用方法
1.配置 profile bean
注意:没有配置 profile 的 bean 将在所有环境都进行创建。
1.1 JavaConfig 方式的场景
Spring 3.1 中,需要在配置类上做 @Profile 注解,例如:@Profile("dev") 、@Profile("prod") 等。
Spring 3.2 开始,@Profile 注解可以应用到方法的级别上,这样就可以将同一个 bean 在两个不同环境的配置放到同一个配置类中了。
1.2 XML 方式的场景
在XML的配置中,我们除了可以在根 <beans> 元素加上 profile 属性,也可以在 <beans> 元素内嵌套多个 <beans> 元素,每个元素存放一个环境的配置,而不需要为每个环境都创建一个 XML 文件。例如:
<beans profile="dev" >< /beans>
或
<beans>
<beans profile="dev" >< /beans>
<beans profile="prod" >< /beans>
< /beans>
2.激活 profile
2.1 判断条件
Spring 确定当前哪个环境处于激活状态,需要依赖于两个属性:
- spring.profiles.active
- spring.profile.default
当没有设置 active 时,Spring 才会去根据 default 的值来判断,若两个都没设置,就没有激活的 profile,Spring 只会创建那些没有配置 profile 的bean。
2.2 设置方式
active 和 default 的值有多种设置方式,你可以自己组合满足需要:
- 作为 DispatcherServlet 的初始化参数
- 作为 Web 应用的上下文参数
- 作为 JNDI 的条目
- 作为环境变量
- 作为 JVM 的系统属性
- 在集成测试类上,使用 @ActiveProfiles 注解设置
3.常见的组合使用方式举例:
在 DispatcherServlet 中将 default 的值设置为 "dev",不设置 active 的值,这中代码层面上的设置,可以使所有开发人员下载代码后都使用开发环境的配置运行程序。然后在测试环境中,使用魂晶变量配置 active 的值为 "test",这样所有人提交的代码都将按照测试环境配置运行。
(原创不易,转载请注明出处!!)