美文网首页
Spring实战笔记-第三章-环境与Profile

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

作者: ZacharyJia | 来源:发表于2016-05-12 00:09 被阅读958次

    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

    相关文章

      网友评论

          本文标题:Spring实战笔记-第三章-环境与Profile

          本文链接:https://www.haomeiwen.com/subject/woiurttx.html