0.技术所要解决的问题
在开发软件时候,有一个很大的挑战就是将应用从一个环境迁移到另外一个环境。开发阶段中,某些环境相关做法可能并不合适迁移到生产环境中,甚至迁移过去也无法工作。例如数据库配置,加密算法,外部部署~~
profile bean 可以根据环境选择创建 bean 和不创建哪个 bean。
要使用profile,首先要将所有不同 bean 定义整理到一个或多个 profile 之中,在将应用部署到每个环境时,要确保对应的profile处于激活的状态。程序运行,根据环境不同,决定激活不同的profile,来创建对应的 bean。
1.配置 profile bean
比如下面一个简单的bean对象
@Configuration
@Profile("dev")
public class test {
@Bean(destroyMethod = "shutdown")
public DataSource dataSource(){
return new DataSource() {
····
····
}
}
}
}
@Profile 注解应用在了类级别上。它会告诉 Spring 这个配置类中的 bean 只有在 dev profile 激活时候才会创建。如果 dev profile 没有激活的画,那么带有 @Bean 注解的方法都会被忽略掉。
注意:
- 在Spirng 3.1中,只能在类级别上使用@Profile注解。不过,从Spring 3.2开始你也可以在方法级别上使用@Profile
- 如果没有指定profile的bean始终都会被创建,与激活哪个profile没有关系。
- XML也可以配置profile
2.激活profile
Spirng在确定哪个 profile 处于激活状态时,需要依赖两个独立的属性:spring.profiles.active 和 spring.profiles.default 。
- 如果设置了spring.profiles.active 那么它的值就会用来确定哪个profile是激活的。
- 但如果没有设计 spring.profiles.active 属性的画,那么Spring将会查找spring.profiles.default 的值
- 如果spring.profiles.active 和 spring.profiles.default 均没有设置的画,那就没有激活的profile,因此只会创建那些没有定义profile中的bean。
有多种方式来设置这两个属性:
- 作为 DispatcherServlet 的初始化参数;
- 作为 Web 应用的上下文参数
- 作为 JNDI 条目
- 作为环境变量
- 作为 JVM 的系统属性
- 在集成测试类上,使用 @ActiveProfiles 注解设置
作为简单介绍,这里使用Spring提供的@ActiveProfiles 注解,进行测试时候,需要激活的profile。(个人在写 Web应用但hi后,使用的是第一种与第二种方式结合)
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={PersistenceTestConfig.class})
@ActiveProfiles("dev")
public class PersistenceTest{
···
}
参考书目《Spring实战》