您的位置:首页 > 编程语言 > Java开发

使用Spring3.1后的的Profile配置使不同环境加载不同配置文件

2017-09-28 16:32 513 查看
需求:项目运行在不同的环境中,每次运行项目的时候,都要重新手动配置配置文件,这样很容易出错,还好Spring3.1以后又出良心之作–profile,看了其他大佬一些做法,感触颇深,但仍然有疑惑,在这里提出来跟大家探讨一下。

配置文件结构:

|---config
|---common
|---common.properties
|---dev
|---config-dev.properties
|---dpconfig-dev.properties
|---production
|---config-production.properties
|---dpconfig-production.properties
|---spring
|---applicationContext-profile.xml
|---applicationContext-spring.xml
|---test
|---config-test.properties
|---dpconfig-test.properties


applicationContext-profile.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- 测试环境配置文件 -->
<beans profile="test">
<context:property-placeholder location="classpath:test/*.properties, classpath:common/*.properties" />
</beans>

<!-- 生产环境配置文件 -->
<beans profile="production">
<context:property-placeholder location="classpath:production/*.properties, classpath:common/*.properties" />
</beans>

<!-- 开发环境配置文件 -->
<beans profile="development">
<context:property-placeholder location="classpath:dev/*.properties, classpath:common/*.properties" />
</beans>

</beans>


applicationContext-spring.xml

<bean id="dataSource" c
4000
lass="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 数据库基本信息配置 -->
<property name="url" value="${url}"/>
<!--<property name="username" value="${username}"/>
<property name="password" value="${password}"/>-->
<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>
<import resource="applicationContext-profile.xml"/>


事务方面省略,在web.xml中别忘了初始化spring容器.

web.xml

<!-- 配置spring的默认profile
可选值:production(生产环境) test(测试环境) development(开发环境) -->
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>test</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


对于激活Profile的四种方式:

第二种和第三种都试过,其他两种有机会再测。

1.ENV方式: ConfigurableEnvironment.setActiveProfiles("test")
2.JVM参数方式: -Dspring.profiles.active="test"
3.web.xml方式:
<init-param>
<param-name>spring.profiles.active</param-name>
<param-value>test</param-value>
</init-param>
4.标注方式(junit单元测试非常实用):
@ActiveProfiles({"test","productprofile"})


可能是我的理解力不行,所以在这我把我的理解和做法详细的说明一下(仅限第二种和第三种):

一、对于JVM参数方式:

①如果在linux系统中运行(项目已经打成war包发布到tomcat),需要修改bin/catalina.sh, vim 打开文件,添加:
-Dspring.profiles.active="test"
后再运行tomcat即可。

②如果在windows系统中运行(项目已经打成war包发布到tomcat),需要修改bin/catalina.bat 添加
set JAVA_OPTS="-Dspring.profiles.active=test"
即可

③如果是用Eclipse运行项目,需要右键项目run as – run configuration – Arguments – VM arguments加入
-Dspring.profiles.active="test"
运行项目即可

④如果是用IDEA运行项目,需要点击上方工具栏Run – Edit Configurations,项目第一次运行的话需要配置:点击左上角+号,选Tomcat Server – Local,在Application server配置本地的tomcat,在JRE处配置JDK,在VM options中添加
-Dspring.profiles.active="test"
运行项目即可

二、对于web.xml方式:

在各个环境中修改

<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>test</param-value>
</context-param>


的值即可。

此处,发现一个问题:之前的配置文件为:

url:jdbc:mysql://***.**.**.***/numysql?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2b8&allowMultiQueries=true
driverClassName:com.mysql.cj.jdbc.Driver
username:numysql
password:123456


这样的话,一直连接不上数据库一直报异常:

java.sql.SQLException: Access denied for user ‘root’@’localhost’ (using password: YES)

后经试验,应该是编码问题,改成这种mysql的用户名和密码拼接在url后即可解决问题:

url:jdbc:mysql://***.**.**.***/numysql?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2b8&allowMultiQueries=true&user=numysql&password=123456
driverClassName:com.mysql.cj.jdbc.Driver
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 笔记 profile