Spring配置文件获取系统的环境变量

系统:windows系统

在命令行执行:

设置系统环境变量:set env=production

取系统环境变量:echo %env%            回车

production


在Spring的xml配置文件中如何获取系统环境变量:

这个问题困扰了我两天,今天下午终于想到了较为合理的办法:

第一步:写一个监听器

public class EnvorimentConfigListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        
        //此处需要手动在当前电脑上配置环境变量(右键我的电脑--属性--高级系统设置--环境变量)
        String envStr = System.getenv("env");
        if ("test".equals(envStr)) {
            //测试环境
            System.setProperty("env", envStr);
        } else if ("release".equals(envStr)) {
            //生产环境
             System.setProperty("env", envStr);
        } else if ("development".equals(envStr)) {
            //开发环境
            System.setProperty("env", envStr);
        }
} @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { }}

第二步:在web.xml中配置监听器

<!-- 配置环境变量监听器 -->

 
 
<listener>
    <listener-class>com.ywsoftware.oa.EnvorimentConfigListener</listener-class>
</listener>
第三步:取值
<context:property-placeholder location="classpath:common/*.properties, classpath:#{systemProperties['env']}/*.properties" />
<!-- 阿里 druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
      destroy-method="close">
    <!-- 数据库基本信息配置 -->
    <property name="url" value="${url}"/>
    <property name="username" value="${username1}"/>
    <property name="password" value="${password1}"/>
    <property name="driverClassName" value="${driverClassName}"/>
    <property name="filters" value="${filters}"/>
    <!-- 最大并发连接数 -->
    <property name="maxActive" value="${maxActive}"/>
    <!-- 初始化连接数量 -->
    <property name="initialSize" value="${initialSize}"/>
    <!-- 配置获取连接等待超时的时间 -->
    <property name="maxWait" value="${maxWait}"/>
    <!-- 最小空闲连接数 -->
    <property name="minIdle" value="${minIdle}"/>
    <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
    <property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/>
    <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
    <property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}"/>
    <property name="validationQuery" value="${validationQuery}"/>
    <property name="testWhileIdle" value="${testWhileIdle}"/>
    <property name="testOnBorrow" value="${testOnBorrow}"/>
    <property name="testOnReturn" value="${testOnReturn}"/>
    <property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}"/>
    <!-- 打开removeAbandoned功能 -->
    <property name="removeAbandoned" value="${removeAbandoned}"/>
    <!-- 1800秒,也就是30分钟 -->
    <property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/>
    <!-- 关闭abanded连接时输出错误日志 -->
    <property name="logAbandoned" value="${logAbandoned}"/>
</bean>

解释一下我的代码:
   首先注意:这个监听器要放在加载spring配置文件的listener或servlet的前面
   这个监听器的作用是在程序启动的时候,一加载servletContext时,就去判断当前系统的环境变量中env的值是什么
(不同环境里需要手动配置不同的env的值,目的是在不同环境中运行项目的时候,需要加载不同的配置文件,
此处就是指不同的数据库及其配置),然后会根据这个值向jvm系统变量中存值。然后可以在项目中通过
#{systemProperties['env']}取到env对应的值。然后就会去找对应的文件夹下面的配置文件。
出现的问题:
username和password一直取不到,报拒绝访问数据库异常。
原因:username和password可能被占用(可是没有找到)
这里提供两种解决方法:
把username和password放在url后面:url=
jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2b8&allowMultiQueries=true&user=root&password=root
 
 
把username和password换成username1和password1(这个随意换,自己别忘就行)
然后问题基本解决。
欢迎讨论!!!~~~


猜你喜欢

转载自blog.csdn.net/peaceForEveryOne/article/details/78126344
今日推荐