Spring多环境配置文件自动切换

===

Spring多环境配置文件自动切换

序言

软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到至少三个不同的环境,开发环境、测试环境以及生产环境。(有些较复杂的大型软件系统还有用户验收环境或公众测试环境等)通常这三个环境会有很多配置参数不同,例如数据源、文件路径、日志选项、中间件、缓存库等,如果每次上线一个新版本时都手动修改配置会十分繁琐,容易出错。
能不能使用一些自动化的手段来进行管理呢
常见的Spring项目的可以采取策略来自动化配置

多环境配置自动切换的解决方案

1 一劳永逸的方案

更换Spring Boot

Spring Boot使用了一个全局的配置文件application.xml
通过启动时指定spring.profiles.active参数即可轻松切换配置文件

2 投机取巧的方案

在默认情况下 项目的配置文件是放在资源根目录下的
例如../resource/application-context.xml
由此想到 只要项目运行时 在根目录下配置不同的配置文件即可

可以使用maven 在打包时 打入不同的配置文件内容
根据不同环境分别打包 也可实现自动切换配置文件

使用maven war包插件

maven-war-plugin

项目结构

-src
 |---java
 |---resource
    |---prod
    |---test
 |---webapp

pom文件

先配置不同的打包环境 使用侧写描述符

一组侧写配置

    <profile>
            <!---编号--->
            <id>product</id>
            <properties>
            <!---环境属性--->
                <package.environment>prod</package.environment>
            </properties>
    </profile>

完整配置 生产环节product 测试环境development 开发环境test

    <profiles>
        <profile>
            <id>product</id>
            <properties>
                <package.environment>prod</package.environment>
            </properties>
        </profile>
        <profile>
            <id>development</id>
            <properties>
                <package.environment></package.environment>
            </properties>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <package.environment>test</package.environment>
            </properties>
        </profile>
    </profiles>
<build>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <!--没有web.xml文件是否打包失败 看你的项目情况 编程式配置当然是false-->
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <archive>
                    <!-- 打包后不包括pom的描述文件 -->
                        <addMavenDescriptor>false</addMavenDescriptor>
                    </archive>
                    <!--过滤webapp目录下文件-->
                    <warSourceExcludes>WEB-INF/jspbackup/**</warSourceExcludes>
                    <!--配置分环境打包web资源-->
                    <webResources>
                        <resource>
                        <!--根据package.environment属性决定打包某个文件夹到war包中-->
                        <directory>src/main/resources/${package.environment}</directory>
                            <targetPath>WEB-INF/classes</targetPath>
                            <filtering>true</filtering>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
        </plugins>
    </build>

打包时 使用 maven 侧写命令

例如 打生产环境包

mvn package -p product

打出来的包 就是只包含一组配置文件的war包了
可以配置Jenkins、TeamCity等持续化集成工具使用

3 使用侧写配置文件的方案

  • xml配置

1 web.xml

配置context-param 属性为spring的侧写配置

spring.profiles.default

这里配置为 development 开发环境 默认情况下就启动开发环境的配置

    <context-param>
        <param-name>spring.profiles.default</param-name>
        <!-- development:以开发环境启动,test以测试环境启动,production:以生产环境启动 -->
        <param-value>development</param-value>
        <!-- <param-value>test</param-value> -->
        <!-- <param-value>production</param-value> -->
    </context-param>

2 spring配置文件 可以是application-context.xml 或者spring.**xml 由之前在web.xml中指定的值确定

同样的 在其中添加不同环境下注册的bean 在beans标签的 profile属性中配置环境信息

此处注册的是数据源

    <beans profile="development">
        <util:properties id="dev_p_datasource" location="classpath:/config/dev-config-datasource.properties" />
    </beans>

    <beans profile="test">
        <util:properties id="dev_p_datasource" location="classpath:/config/test-config-datasource.properties" />
    </beans>

    <beans profile="production">
        <util:properties id="prod_p_datasource" location="classpath:/config/config-datasource.properties" />
    </beans>

  ……

搭配Spring后置处理器PropertyPlaceholderConfigurer使用 读取不同配置文件

    <beans profile="development">
        <context:property-placeholder location="classpath:/constants/test-constants.properties" />
    </beans>

    <beans profile="production">
        <context:property-placeholder location="classpath:/constants/constants.properties" />
    </beans>
  • 注解配置

注解配置就简单多了

@Component  
@Profile("product")  
public class DataSource{ 
//……
}
  • 运行时切换

基本配置大体就是这两种
但仅仅这样做并不能做到自动切换配置 还需要手动切换标签
Spring提供了多种方法 以在项目启动时 按参数自动加载侧写配置

按以下顺序加载属性
* ServletConfig 配置参数 一般配置在DispatcherServlet的启动参数中
* ServletContext 应用上下文参数 就是本文中采用的配置方法
* JNDI 环境变量
* JVM 系统运行参数 在容器添加JAVA_OPS,如:"-Dspring.profiles.active=dev"
* JVM 环境变量 通过配置系统环境变量激活profile,spring.profile.default=dev

如果有配置JNDI的话可以使用JNDI方式
一般使用JVM运行参数

从tomcat启动项目时
找到/tomcat/bin/catalina.sh文件
在其中 JAVA_OPTS选项下 添加"-Dspring.profiles.active=prod"
此时 启动就是product生产环境的配置文件

  • 测试

测试可以使用注解来加载不同的环境配置

@ActiveProfiles("test")  

测试类

@RunWith(SpringJUnit4ClassRunner.class)  
@ContextConfiguration(locations = "classpath:applicationContext.xml")  
@ActiveProfiles("test")  
public class BasicTest extends AbstractTransactionalJUnit4SpringContextTests 
    原文作者:某魔法的一己之见
    原文地址: https://blog.csdn.net/u011863951/article/details/80720913
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞