系统: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(这个随意换,自己别忘就行)
然后问题基本解决。
欢迎讨论!!!~~~