文章目录
如何在不同的环境下,使用不同的bean?
profile bean
Spring不是在构建时决定创建哪个bean,而是在运行时再确定。这样,同一个包能够适用于所有的环境,没必要重新构建。
Spring 3.1中,引入bean profile功能。
Java配置中,可以使用@Profile
注解指定某个bean属于哪一个profile。
在Spring 3.1中,只能在类级别上使用@Profile
注解,缺点:一个环境的bean只能放在一个类中;
@Configuration
@Profile("dev")
public classs A {
...
}
从Spring 3.2,可以在方法级别上使用@Profile
注解,这样两个bean的声明可以放在同一个类中了;
@Configuration
public classs A {
@Bean
@Profile("dev")
public DataSource dataSource1(){
...
}
@Bean
@Profile("prod")
public DataSource dataSource2(){
...
}
}
核心知识点:
只有当规定的profile激活时,相应的bean才会创建。
没有指定profile的bean始终都会被创建,与激活哪个profile没有关系。
也可以在XML中配置profile
作为<beans>元素的属性。
激活profile
Spring在确定哪个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.profiles.active和spring.profiles.default的最佳组合方式以满足需求。
例如,一种方式是使用DispatcherServlet的参数将spring.profiles.default设置为开发环境的profile,在Servlet上下文中进行设置(为了兼顾到ContextLoaderListener)。作为<context-param> 添加在Web.xml中,例如
<context-param>
<param-name>spring.profiles.default</param-name>
<param-value>dev</param-value>
</context-param>
当应用程序部署到QA、生产或其他环境之中时,负责部署的人根据情况使用系统属性、环境变量或JNDI设置spring.profiles.active即可。
当设置spring.profiles.active以后,至于spring.profiles.default置成什么值就已经无所谓了;系统会优先使用spring.profiles.active中所设置的profile。
注意,在spring.profiles.active和spring.profiles.default中,profile使用的都是复数形式。这意味着你可以同时激活多个profile,这可以通过列出多个profile名称,并以逗号分隔
来实现。当然,同时启用dev和prod profile可能也没有太大的意义,不过你可以同时设置多个彼此不相关的profile。
Spring提供了@ActiveProfiles注解,我们可以使用它来指定运行测试时要激活哪个profile。在集成测试时,通常想要激活的是开发环境的profile。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={MyTestConfig.class})
@ActiveProfiles("dev")
public class MyTest {
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/155743.html