项目的开发环境和测试生产环境要配置的数据库,redis等等,连接地址都不一样。这样在项目部署到测试,生产时总要挨个修改这些配置。通过Spring的profile可以控制在不同的环境在Spring容器中注册不同的配置,然后用一个总开关控制在什么环境用什么配置。
1、修改web.xml
添加
<!-- 环境配置 -->
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>
引入环境配置文件
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-env.xml
</param-value>
</context-param>
导入配置文件 :spring-env.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:tx="http://www.springframework.org/schema/tx"
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-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--加载SpringContextUtils到容器-->
<bean name="springContextUtils" class="com.hxy.base.utils.SpringContextUtils"/>
<beans profile="dev">
<bean id="propertyConfigurer_dev" class="com.hxy.base.utils.SpringPropertiesUtil">
<property name="locations">
<list>
<value>classpath:conf/jdbc-dev.properties</value>
<value>classpath:conf/cas-dev.properties</value>
<value>classpath:conf/redisSentinel.properties</value>
<value>classpath:conf/redis-dev.properties</value>
<value>classpath:conf/app.properties</value>
<value>classpath:conf/baidu.properties</value>
<value>classpath:conf/msg.properties</value>
</list>
</property>
</bean>
</beans>
<beans profile="pro">
<bean id="propertyConfigurer_pro" class="com.hxy.base.utils.SpringPropertiesUtil">
<property name="locations">
<list>
<value>classpath:conf/jdbc-pro.properties</value>
<value>classpath:conf/cas-pro.properties</value>
<value>classpath:conf/redisSentinel.properties</value>
<value>classpath:conf/redis-pro.properties</value>
<value>classpath:conf/app.properties</value>
<value>classpath:conf/baidu.properties</value>
<value>classpath:conf/msg.properties</value>
</list>
</property>
</bean>
</beans>
<beans profile="test">
<bean id="propertyConfigurer_test" class="com.hxy.base.utils.SpringPropertiesUtil">
<property name="locations">
<list>
<value>classpath:conf/jdbc-test.properties</value>
<value>classpath:conf/cas-test.properties</value>
<value>classpath:conf/redisSentinel.properties</value>
<value>classpath:conf/redis-test.properties</value>
<value>classpath:conf/app.properties</value>
<value>classpath:conf/baidu.properties</value>
<value>classpath:conf/msg.properties</value>
</list>
</property>
</bean>
</beans>
</beans>
SpringContextUtils类:
@Component
public class SpringContextUtils implements ApplicationContextAware {
public static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
/**
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
*/
public static <T> T getBean(Class<T> requiredType) {
assertContextInjected();
return applicationContext.getBean(requiredType);
}
/**
* 检查ApplicationContext不为空.
*/
private static void assertContextInjected() {
Validate.validState(applicationContext != null, "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
}
public static <T> T getBean(String name, Class<T> requiredType) {
return applicationContext.getBean(name, requiredType);
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name) {
return applicationContext.isSingleton(name);
}
public static Class<? extends Object> getType(String name) {
return applicationContext.getType(name);
}
}