Spring实战笔记-第三章-环境与Profile

2016-05-12  本文已影响958人  ZacharyJia

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处于激活状态时,依赖两个属性:

  1. spring.profiles.active
  2. spring.profiles.default

如果设置了spring.profiles.active属性的话,则使用它的值,否则就会查找spring.profiles.default属性的值。如果这两个值都没有设置,则只会创建没有定义在profile中的bean。

这两个属性的设置方法:

  1. 作为DispatcherServlet的初始化参数
  2. 作为Web应用的上下文参数
  3. 作为JNDI条目
  4. 作为环境变量
  5. 作为JVM的系统属性
  6. 在集成测试类上,使用@ActiveProfiles注解设置

在继承测试类中,可以使用如下代码激活dev profile:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {CDPlayerConfigDev.class})
@ActiveProfiles("dev") <-----在这里使用注解设置
public class CDPlayerTest {

}

感谢您的阅读!
本账号已经不再更新,更多文章请移步我的个人博客https://www.zacharyjia.me

上一篇下一篇

猜你喜欢

热点阅读