• SpringInAction-- 配置Profile Bean


    Profile Bean 使用场景描述:

    在开发软件的时候,在数据库方面,往往不是一个库就能解决的,一般分为开发库、测试库、生产库,在这些库设置链接的时候,也会配置其对应的数据。

    现有一种方式,就是单独的配置类,或者在xml中配置bean,然后在构建的时候确定哪一个配置编译到部署的应用。这种方式是可行的,但是也是有问题存在的,即当从开发阶段迁移到QA阶段的时候,重新部署是没有问题的,但是从QA阶段迁移到生产阶段的时候,重建有可能会引入bug并且会使得QA团队成员中带来不安的情绪。

    这个时候我们就可以引入profile了

    profile bean的好处

    Spring提供的profile bean 配置,其原理是根上面的解决方式没啥区别,两种方法的区别就是在于spirng在运行的时候,会根据环境决定哪些bean应该被创建,哪些不被创建。因为不是在部署前去判断的,而是等运行的时候来判断的,这样一来,一个部署单元(可能是war包)就能够适合所有的环境,这样一来就没有必要重构了。

    接下里就让我们从例子中来领会它的含义

    假设我们有三种坐骑,当我们在陆地的时候可以选择 跳跳蛙、在天空的时候选择小黑龙、在海洋中的时候选择 皮皮虾。。

    这样一来我们先创造一个 宠物坐骑接口类 PetMounts  然后分别创造自己的坐骑。 FlyingMounts LandMounts   、SeaMounts

    PeTMounts

    package com.bean.profile;
    
    /**
     * Created by IntelliJ IDEA.
     * Author XueYuan
     * Data  2017/02/22
     * Time  16:46
     */
    
    public interface PetMounts {
    
        void letsGo();
    }

    FlyingMounts

    package com.bean.profile;
    
    /**
     * Created by IntelliJ IDEA.
     * Author XueYuan
     * Data  2017/02/22
     * Time  16:52
     */
    
    public class FlyingMounts implements PetMounts {
    
        public void letsGo() {
            System.out.println("我是飞行坐骑 小黑龙,我们走……!");
        }
    }

    LandMounts

    package com.bean.profile;
    
    /**
     * Created by IntelliJ IDEA.
     * Author XueYuan
     * Data  2017/02/22
     * Time  16:53
     */
    
    public class LandMounts implements  PetMounts {
        public void letsGo() {
    
            System.out.println("我是陆地坐骑 跳跳蛙,我们走……!");
        }
    }

    SeaMounts

    package com.bean.profile;
    
    import org.springframework.stereotype.Component;
    
    /**
     * Created by IntelliJ IDEA.
     * Author XueYuan
     * Data  2017/02/22
     * Time  16:54
     */
    
    @Component
    public class SeaMounts implements PetMounts {
        public void letsGo() {
    
            System.out.println("我是海洋坐骑 皮皮虾,我们走……!");
        }
    }

    好了坐骑我们创造好了,下面就开始根据环境来选择什么坐骑。

    首先先来看 java文件的配置方法

    package com.bean.profile;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Profile;
    
    /**
     * Created by IntelliJ IDEA.
     * Author XueYuan
     * Data  2017/02/22
     * Time  16:44
     */
    
    
    @Configuration
    public class PetMountsConfig {
    
    
        @Bean
        @Profile("sky")
        public PetMounts sky() {
            return new FlyingMounts();
        }
    
        @Bean
        @Profile("land")
        public PetMounts land() {
            return new LandMounts();
        }
    
        @Bean
        @Profile("sea")
        public PetMounts sea() {
            return new SeaMounts();
        }
    
    
    }

    我们要分别创建Bean 然后在对应的方法上面添加profile

    小贴士:在Spring3.1之前只能在类级别上面添加@Profile注解;从Spring3.2后开始就支持在方法上面添加注释

    xml中配置Profile

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           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">
    
        <beans profile="sky">
            <bean id="flyingMounts" class="com.bean.profile.FlyingMounts"/>
        </beans>
    
        <beans profile="land">
            <bean id="landMounts" class="com.bean.profile.LandMounts"/>
        </beans>
    
        <beans profile="sea">
            <bean id="seaMounts" class="com.bean.profile.SeaMounts"/>
        </beans>
    
    
    </beans>

    在xml中配置,主要是利<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注解设置。

     下面就是在web中配置 profile (偷懒了下 直接书上的图片)

    在测试中使用Profile的时候 方法如下:

    @RunWith(SpringJUnit4ClassRunner.class)
    /*@ContextConfiguration(classes = PetMountsConfig.class)*/
    @ContextConfiguration(value = "config.xml")
    @ActiveProfiles("sea")
    public class LetsGo {
    
      ……
    }

    激活方法我们也知道了,现在就让我们选择一个坐骑,去把妹吧!

    package com.bean.profile;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ActiveProfiles;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    /**
     * Created by IntelliJ IDEA.
     * Author XueYuan
     * Data  2017/02/22
     * Time  20:42
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    /*@ContextConfiguration(classes = PetMountsConfig.class)*/
    @ContextConfiguration(value = "config.xml")
    @ActiveProfiles("sea")
    public class LetsGo {
    
        @Autowired
    PetMounts petMounts;
    
        @Test
        public void LetsGoLog(){
            petMounts.letsGo();
        }
    }

    以上就是peofile bean简单小例子,如有错误,请指出,谢谢~

    代码:https://github.com/eoooxy/springinaction test下 的com.bean.profile中

  • 相关阅读:
    编译原理学习导论-作者四川大学唐良(转)初学者必看
    Ajax在chrome浏览器中测试调用失败解决办法
    sublime中输入法输入框只能在一个位置
    第三次作业
    第二次作业
    第一次作业
    2018年 大一下学期第零次作业
    14,15周作业
    第七周作业
    第六周作业
  • 原文地址:https://www.cnblogs.com/eoooxy/p/6431195.html
Copyright © 2020-2023  润新知