美文网首页征服SpringJava学习笔记Java&Spring基础技术
如何通过Spring Profile进行多环境配置

如何通过Spring Profile进行多环境配置

作者: 文远斯验 | 来源:发表于2017-05-15 19:12 被阅读200次

    在系统开发,测试,到最终上线发布的过程中,切换环境是一个很常见的需求,不同环境中的参数(例如数据库配置、日志系统的级别)并不相同,如果每次切环境都要手动修改配置,实在称不上高效优雅,这就使得如何低成本地切换环境成为了一个非常实际的问题。

    我在上一篇文章如何通过Maven Profile进行多环境配置中,介绍了一种低成本切换环境的解决方案,但是每次切换环境都必须通过Maven重新构建,不但稍嫌麻烦而且有引入bug的可能,所以这次我会介绍另一种更加灵活的解决方案,即Spring Profile。

    其实Spring Profile与Maven Profile在解决多环境配置的思路上并没有太大区别,同样是在资源文件中事先设置好不同环境中用到的参数,然后根据环境选择使用哪一个资源文件。唯一的区别是Spring不会在构建的时候选择资源文件,而是在运行的时候选择,所以打出的war包能够直接用于不同的运行环境,而不需要重新构建。下面我依旧举一个简单的例子方便大家理解。
    </br>

    1. 资源文件

    在资源文件中设置好不同环境所需的参数


    资源文件列表
    开发环境参数
    生产环境参数

    </br>

    2. 配置Spring Profile
        <!--开发环境-->
        <beans profile="development">
            <util:properties id="config" location="classpath:properties/development/properties"/>
        </beans>
    
        <!--生产环境-->
        <beans profile="production">
            <util:properties id="config" location="classpath:properties/production/properties"/>
        </beans>
    
        <!--其他Bean-->
        <beans>
            <bean id="demoBean" class="com.demo.DemoBean" ></bean>
        </beans>
    

    Spring会根据Profile的激活状态创建相应的Bean,而Profile的激活状态取决于两个属性,即spring.profiles.active和spring.profiles.default。
    如果设置了spring.profiles.active属性,Spring就会根据它判断哪些Profile处于激活状态,如果没有设置spring.profiles.active,Spring则会退而求其次根据spring.profiles.default判断Profile的激活状态。
    </br>

    3. Bean赋值
    @Component
    public class DemoBean {
    
        @Value("#{config.name}")
        private String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    

    </br>

    4. 激活Profile
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "classpath:applicationContext" })
    @ActiveProfiles("development")
    public class DemoBeanService {
    
        @Autowired
        private DemoBean demoBean;
    
        @Test
        public void main() {
            System.out.println("Current environment: "+demoBean.getName());
        }
    }
    

    </br>

    5.结果

    </br>

    常用的Profile激活方式

    Spring提供了多种激活Profile的方式,大家可以灵活使用以下任意一种方式激活Profile:

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

    当然在实际工作中比较常用的激活方式还是使用环境变量或JVM的系统属性,接下来我们以JVM属性为例,去掉代码中的@ActiveProfiles("development"),并尝试在IDEA的JVM参数设置中激活production Profile:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "classpath:applicationContext" })
    //@ActiveProfiles("development")
    public class DemoBeanService {
    
        @Autowired
        private DemoBean demoBean;
    
        @Test
        public void main() {
            System.out.println("Current environment: "+demoBean.getName());
        }
    }
    

    结果和预期的一样:

    相关文章

      网友评论

        本文标题:如何通过Spring Profile进行多环境配置

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