3.1 环境与Profile
0x01 原因:
在开发阶段,某些环境相关的配置并不适合直接迁移到生产环境中。比如数据库配置、加密算法以及与外部系统的集成是跨环境部署。
0x02 Spring提供的解决方案
在3.1版本中,spring引入了bean profile功能。通过将可能发生变化的不同的bean定义到一个或多个profile中,当其对应的profile处于激活(active)状态时,则该bean生效。
0x03 使用方法
1. Java配置
在Java配置中,可以使用@Profile注解指定某个bean属于哪一个profile。
例如,对于数据库的DataSource的配置:
@Configuration
@Profile("dev")
public class DevelopmentProfileConfig {
@bean(destroyMethod="shutdown")
public DataSource dataSource() {
return new ……
}
}
这个Profile注解应用在了类级别上,表明只有在dev profile激活时时,该类中的bean才会被创建。
同时,我们还可以创建一个应用于生产环境的配置。
@Configuration
@Profile("prod")
public class ProductionProfileConfig {
@bean
public DataSource dataSource() {
return new ……
}
}
该类中的bean,只有在prod profile激活时才会生效。
另外,在spring 3.1中,只能在类级别上使用@Profile注解,而从spring 3.2 开始,也可以在方法级别上使用@Profile注解。这样,就可以在同一个类中,定义属于不同profile的bean。
需要注意的是,没有指定profile的bean配置,在任何情况下都会被创建。
2.在XML中配置
如果项目使用xml进行配置的话,也可以在xml中定义bean所属的profile。
可以在xml文件最外层的beans标签内加入profile="dev"
属性。
也可以在内嵌的beans标签中加入profile="dev"
属性。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.1.xsd"
profile="dev"> <-----在最外层的beans中定义
<util:list id="trackList">
<value>Track1</value>
<value>Track2</value>
</util:list>
<bean id="compactDisc" class="soundsystem.BlankDisc" c:title="Sgt Peppers" c:artist="The Beatles" c:tracks-ref="trackList">
</bean>
<bean id="cdPlayer" class="soundsystem.CDPlayer" p:cd-ref="compactDisc">
</bean>
</beans>
或者如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.1.xsd">
<util:list id="trackList">
<value>Track1</value>
<value>Track2</value>
</util:list>
<beans profile="dev"> <-----在嵌套的beans标签中加入,只在该标签内部生效
<bean id="compactDisc" class="soundsystem.BlankDisc" c:title="Sgt Peppers" c:artist="The Beatles" c:tracks-ref="trackList">
</bean>
</beans>
<bean id="cdPlayer" class="soundsystem.CDPlayer" p:cd-ref="compactDisc">
</bean>
</beans>
0x04 激活对应的profile
前面说了在指定profile定义bean,那么该如何激活对应的profile,使bean生效呢?
spring在确定哪个profile处于激活状态时,依赖两个属性:
- spring.profiles.active
- spring.profiles.default
如果设置了spring.profiles.active
属性的话,则使用它的值,否则就会查找spring.profiles.default
属性的值。如果这两个值都没有设置,则只会创建没有定义在profile中的bean。
这两个属性的设置方法:
- 作为DispatcherServlet的初始化参数
- 作为Web应用的上下文参数
- 作为JNDI条目
- 作为环境变量
- 作为JVM的系统属性
- 在集成测试类上,使用@ActiveProfiles注解设置
在继承测试类中,可以使用如下代码激活dev profile:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {CDPlayerConfigDev.class})
@ActiveProfiles("dev") <-----在这里使用注解设置
public class CDPlayerTest {
}
感谢您的阅读!
本账号已经不再更新,更多文章请移步我的个人博客https://www.zacharyjia.me