zoukankan      html  css  js  c++  java
  • spring mvc多环境下配置文件的设置

    在实际开发时经常需要把一些配置信息写在配置文件,比如mysql的主机地址、端口号、用户名和密码等。另外,在开发代码时可能用一套配置参数,而部署到测试环境时又会用另一套配置参数,测试完毕再部署到线上环境时,又需要使用线上环境下的另一套参数。因此,实际开发中面临着如何给工程添加多个环境下的配置文件、且要保证不同环境下能自动使用不同的配置文件的问题。

    spring提供了spring.profiles.active参数,通常情况下,这个值我们会设置为dev、test和online中的一个,分别代表开发环境、测试环境和线上生产环境。比如当spring.profiles.active的值为dev时,表示当前运行于开发环境下,应当使用开发环境下的配置文件。

    通过在运行程序时给spring.profiles.active参数传入不同的值以选择不同的配置文件。这样只需要打包一次,不必为不同的环境各打包一次了。

    下面来演示如何在运行阶段选择配置文件。在上一篇的工程的基础上进行修改(或者先将上面的工程恢复成最初的样子)。

    首先在resoures目录下创建4个配置文件,分别为application.properties、application-dev.properties、application-test.properties和application-online.properties。其中application.properties文件里存放的是所有环境下都通用的配置信息,另外3个则分别对应开发环境、测试环境和线上环境的配置:

     

    因为配置文件要到工程运行时才会进行选择,因此,所有的配置文件都是需要打包到项目中的。先在3个环境下都通用的application.properties文件中加入一个配置项,参数为city.name,值为beijing:

    city.name=beijing


    和前面的例子一样,dev、test和online环境的配置文件都配置了一个名为env.name的参数,值分别为env-dev、env-test和env-online。

    接下来修改spring.xml,增加如下一行配置如下:

    1 <context:property-placeholder location="classpath:application.properties, classpath:application-${spring.profiles.active}.properties"/>


    这一行是告诉spring容器去哪加载配置文件。这里添加了两个配置文件,一个是所有环境都通用的application.properties文件,另一个则取决于spring.profiles.active参数的值是多少,如果是dev(即开发环境),则是application-dev.properties文件;同理,如果是test(测试环境)则是application-test.properties文件;如果是online(线上环境)则是application-online.properties文件。

    为了观察配置的效果,修改HelloServiceImpl文件的内容如下:

     1 package com.mytest.service.impl;
     2 
     3 import com.mytest.service.HelloService;
     4 import org.springframework.beans.factory.annotation.Value;
     5 import org.springframework.stereotype.Service;
     6 
     7 @Service
     8 public class HelloServiceImpl implements HelloService {
     9 
    10   @Value("${env.name}")
    11   private String envName;
    12 
    13   @Value("${city.name}")
    14   private String cityName;
    15 
    16   @Override
    17   public String sayHello(String to) {
    18     return "hello " + to + ", env.name:" + envName + ", cityName:" + cityName;
    19   }
    20 }

    HelloServiceImpl除了引用了配置文件中的env.name参数外,还引用了通用配置文件中的city.name参数。

    接下在maven命令行中执行如下命令构建整个工程:

    1 clean package


    这里构建时没有再传入任何参数了。

    接下来将打包好的mvc-test-1.0-SNAPSHOT.war文件拷贝到tomcat的webapps目录下,并改名为mvc-test.war。

    运行时进行配置文件的选择,其原理就是在用java命令执行java程序时传入给spring.profiles.active参数不同的值,比如:

    1 java xxx -Dspring.profiles.active=dev


    这样就在启动程序时就把spring.profiles.active参数的设置为dev了。

    因为tomcat是我们通常是用它自身bin目录下的catalina.sh脚本来启动的,所以我们把启动参数写到这个脚本里。打开catalina.sh脚本,搜索到如下行:

    1 JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS"

    将其改成:

    1 JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Dspring.profiles.active=dev"


    表示现在是开发环境。保存并退出,然后在tomcat的bin目录下执行以下命令以启动tomcat:

    1 sh ./catalina.sh run


    然后在浏览器中输入http://localhost:8080/mvc-test/hello?name=tom,回车即可看到结果:

     

    可以看到,程序正确地选择了开发环境下的配置文件。

    用同样的方法,将spring.profiles.active设置为test,并重新启动tomcat,在浏览器中访问,可以看到程序正确地选择了测试环境下的配置文件:

     

    将spring.profiles.active设置为online,并重新启动tomcat,在浏览器中访问,可以看到程序正确地选择了线上环境的配置文件:

     

    我们再看下tomcat的webapps目录下,mvc-test的目录结构:


    可以看到所有的配置文件都打包到WEB-INF/classes目录下了,因为是运行时才选择配置文件,所以所有的配置文件都要打包过来。

    综上,可以将所有环境都通用的配置信息写入到application.properties文件中,而不同运行环境下不同的配置信息则分别写入到application-dev.properties、application-test.properties和application-online.properties文件中,再通过运行程序时给sring.profiles.active参数传入不同的值(dev或test或online)即可完成不同运行环境下选择不同的配置文件的功能。

  • 相关阅读:
    Spring Security简介与入门Demo
    电商项目之多功能增删改查案例
    linux-用户管理
    zabbix3.4配置第三方邮件报警
    zabbix3.4配置客户端配置
    centos7上安装zabbix3.4的详细步骤与问题处理记录
    MyBatis日记(五):一对一关系,一对多关系
    MyBatis日记(四):MyBatis——insert、update、delete、select
    Python日记(二):Python之禅
    Python日记(一):拜见小主——Python
  • 原文地址:https://www.cnblogs.com/haw2106/p/12084697.html
Copyright © 2011-2022 走看看