spring的xml配置文件中获取环境变量,动态配置文件路径

场景

想要一个发布包部署uat和生产环境,但是uat和生产的数据库以及周边服务提供方的url不一致,同一套配置不能通用。
之前都是在maven打包阶段选取profile,然后把对应环境的配置替换到发布包里。这个包只适用于特定的环境

解决方案

  1. 发布环境添加环境变量,DEPLOY_ENV=dev(或者uat/prod等等)标记当前环境
  2. 本地存放多套配置文件,分别放到对应环境目录下
  3. 配置加载的时候,文件路径加上 System.getenv("DEPLOY_ENV") 获取当前环境信息
  4. spring的properties配置文件读取增加环境变量的配置,如:
<bean id="propertyConfigurer" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config/#{systemEnvironment['DEPLOY_ENV']?:'dev'}/datasource/jdbc.properties</value>
                <value>classpath:config/#{systemEnvironment['DEPLOY_ENV']?:'dev'}/fxt/server.properties</value>
            </list>
        </property>
    </bean>

其中 #{systemEnvironment['DEPLOY_ENV']?:'dev'} 用来获取环境变量DEPLOY_ENV,默认为“dev”

优缺点

缺点很明显,一个包里边需要放所有环境的配置信息,可能会到只所有环境信息泄露的安全问题?多套配置管理繁琐,当然之前通过maven打包的时候放入对应环境的配置也是需要维护多套环境的配置,这点上并没有什么优化

优点就是可以一个包通用所有环境了,通过自动化发布脚本配置对应环境的DEPLOY_ENV环境变量。

后续如果抛弃springMVC的话,可以引入spring cloud的config server组件,方便不同环境的配置问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容