`

spring使用PropertyPlaceholderConfigurer扩展来满足不同环境的参数配置

 
阅读更多

spring使用PropertyPlaceholderConfigurer扩展来满足不同环境的参数配置,

来自:http://www.javaarch.net/jiagoushi/548.htm

 

PropertyPlaceholderConfigurer是spring提供我们来把一些环境变量(数据库连接相关参数,文件路径等)统一管理起来,然后在bean中指定对应的变量的。但是往往开发环境,测试环境,生成环境的这些参数配置是不同的,那么我们如何使用PropertyPlaceholderConfigurer扩展来满足不同环境的配置需求,而不需要在不同环境需要修改代码或者配置。

 

1.我们扩展下PropertyPlaceholderConfigurer,可以通过在properties中production.mode默认配置来或者不同环境的配置,然后有限通过取系统环境变量的这个值来作为我们开发环境,测试环境,生产环境的选择。

	import java.io.IOException;
	import java.util.Map.Entry;
	import java.util.Properties;
	import java.util.Set;

	import org.apache.commons.lang.StringUtils;
	import org.springframework.beans.factory.InitializingBean;
	import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
	/**
	 * 可以按照不同的运行模式启用相应的配置
	 * 
	 */
	public class MutilPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer implements InitializingBean {
		
		private static final String PRODUCTION_MODE = "production.mode";
		// 缓存所有的属性配置
		private Properties          properties;
		/**
		 * @return the mode
		 */
		public String getMode() {
			return properties.getProperty(PRODUCTION_MODE);
		}
		@Override
		protected Properties mergeProperties() throws IOException {
			Properties mergeProperties = super.mergeProperties();
			// 根据路由原则,提取最终生效的properties
			this.properties = new Properties();
			// 获取路由规则,系统属性设置mode优先
			String mode = System.getProperty(PRODUCTION_MODE);
			if (StringUtils.isEmpty(mode)) {
				String str = mergeProperties.getProperty(PRODUCTION_MODE);
				mode = str != null ? str : "ONLINE";
			}
			properties.put(PRODUCTION_MODE, mode);
			String[] modes = mode.split(",");
			Set<Entry<Object, Object>> es = mergeProperties.entrySet();
			for (Entry<Object, Object> entry : es) {
				String key = (String) entry.getKey();
				int idx = key.lastIndexOf('_');
				String realKey = idx == -1 ? key : key.substring(0, idx);
				if (!properties.containsKey(realKey)) {
					Object value = null;
					for (String md : modes) {
						value = mergeProperties.get(realKey + "_" + md);
						if (value != null) {
							properties.put(realKey, value);
							break;
						}
					}
					if (value == null) {
						value = mergeProperties.get(realKey);
						if (value != null) {
							properties.put(realKey, value);
						} else {
							throw new RuntimeException("impossible empty property for " + realKey);
						}
					}
				}
			}
			return properties;
		}
		/**
		 * 开放此方法给需要的业务
		 * 
		 * @param key
		 * @return
		 */
		public String getProperty(String key) {
			return resolvePlaceholder(key, properties);
		}
		@Override
		public void afterPropertiesSet() throws Exception {
			// TODO Auto-generated method stub	
		}
	}

 

然后我们在properties中可以这么配置:也就是默认配置是ONLINE 生产模式,那么只要在系统变量中没有配置production.mode,则我们取ONLINE的配置,也就是下面的参数取后缀为_ONLINE的配置。

 

	production.mode=ONLINE


	#lucene index data dir
	lucene.index.dir_DEV=e:\\logs\\lucene
	lucene.index.dir_ONLINE=/home/admin/data

	#velocity
	file.resource.loader.cache_DEV=false
	file.resource.loader.modificationCheckInterval_DEV=2
	file.resource.loader.cache_ONLINE=true
	file.resource.loader.modificationCheckInterval_ONLINE=-1

 对应spring的配置为:

	<!-- velocity -->
	<import resource="classpath*:*.xml" />
	<bean id="velocityConfigurer"
		class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
		<property name="resourceLoaderPath">
			<value>WEB-INF/velocity/</value>
		</property>
		<property name="velocityProperties">
			<props>
				<prop key="directive.foreach.counter.name">velocityCount</prop>
				<prop key="directive.foreach.counter.initial.value">1</prop>
				<prop key="input.encoding">GBK</prop>
				<prop key="output.encoding">GBK</prop>
				<prop key="file.resource.loader.cache">${file.resource.loader.cache}</prop>
				<prop key="file.resource.loader.modificationCheckInterval">${file.resource.loader.modificationCheckInterval}</prop>
				<prop key="velocimacro.library.autoreload">false</prop>
				<prop key="velocimacro.library">macro.vm</prop>
			</props>
		</property>
	</bean>

 

这种参数包括数据库连接串,文件路径等都可以这么配,因为velocity在测试环境不需要cache,能够修改即生效,但是线上环境加上cache则能提高性能,所以,默认使用ONLINE的配置,但是在测试环境的VM参数中加上-Dproduction.mode=DEV,则在开发环境用的是_DEV后缀的配置,到了线上代码则不用改。非常方便。

最好就是架上placeholder的自定义配置bean

	<bean id="placeholder"
		class="org.springweb.core.MutilPropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:jdbc.properties</value>
				<value>classpath*:*-placeholder.properties</value>
			</list>
		</property>
	</bean>

 

2
4
分享到:
评论
1 楼 jinnianshilongnian 2013-05-21  
spring profile 或 如maven profile 就是来干这件事的。

相关推荐

    第十九章 Spring Environment 抽象(Environment Abstraction)1

    深入理解Spring Environment和Profiles,可能会出现在高级Spring开发者或架构师的面试题目中,包括如何管理不同环境的配置、如何使用@Profile以及如何扩展配置属性源等。 总结来说,Spring Environment抽象是...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.5.4. 为不同的bean配置不同的事务语义 9.5.5. &lt;tx:advice/&gt; 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 9.5.7. 插入事务操作 9.5.8. 结合AspectJ使用 @Transactional 9.6. 编程式...

    spring读取properties

    在Spring框架中,读取和使用Properties文件是一种常见的配置方式,尤其当涉及到数据库连接、环境变量等需要在运行时动态加载或更改的信息时。本文将深入解析如何在Spring环境中读取Properties文件,包括配置步骤、...

    spring配置两个数据

    而在多数据源管理方面,Spring同样提供了灵活且强大的支持,允许开发者在一个应用程序中配置和使用多个数据源,满足了复杂业务场景下对不同数据库操作的需求。 ### Spring配置两个数据源 #### 核心概念解析 **...

    spring

    - **设置Bean属性和协作对象**:Spring允许通过setter方法或构造函数来注入依赖。 - **自动装配**:Spring可以自动检测并注入Bean之间的依赖关系,无需显式配置。 - **依赖检查**:Spring可以检查应用程序中是否存在...

    spring资源文件

    10. **Profile支持**:Spring支持多环境配置,通过`@Profile`注解,可以为不同的运行环境(如dev、test、prod)提供不同的Bean配置。 综上所述,Spring资源文件的使用涉及到了Spring框架的多个核心概念,包括配置...

    spring02-6

    在Spring Boot中,我们可以使用`spring.profiles.active`属性来指定当前环境使用的配置。 总结一下,Spring中的属性注入是一个强大且灵活的功能,它帮助我们解耦代码和配置,使得应用程序能够适应不同的运行环境。...

    spring,struts和hibernate的综合运用

    2. **Spring配置**:Spring通过`PropertyPlaceholderConfigurer`来读取配置文件(如jdbc.properties),并将其中的数据库连接参数注入到Spring的`dataSource` Bean中。Spring使用`BasicDataSource`作为数据源,并...

    属性占位符配置器

    - **环境变量配置**:在不同部署环境中使用不同的配置参数,例如开发、测试和生产环境。 - **敏感信息管理**:避免将敏感信息直接写入代码或配置文件中,提高安全性。 #### 三、具体实现与代码示例 在实际应用中,...

    struts2 hibernate spring集成

    - 在配置过程中,可以选择使用Spring管理SessionFactory,但根据需求可以取消勾选,以便更灵活地进行配置。 - 完成配置后,可以在项目中看到自动生成的相关配置文件和目录结构。 3. **添加Spring支持**: - 右键...

    spring.net中文手册在线版

    使用环境变量进行替换 4.9.2.PropertyOverrideConfigurer类 4.10.使用alias节点为对象添加别名 4.11.IApplicationContext简介 4.12.配置应用程序上下文 4.12.1.注册自定义解析器 4.12.2.创建自定义资源处理器 4.12.3...

    spring源码经典实例

    2. **配置文件改进**:将`jdbc.properties`移动到合适的位置,如`src/main/resources`,并使用Spring的`PropertyPlaceholderConfigurer`或者`@Value`注解读取配置,以实现数据库连接参数的动态加载。 3. **使用...

    Spring MVC 入门教程

    2. **配置环境**:编写`web.xml`,`applicationContext.xml`和`lxm-servlet.xml`等配置文件。 3. **编写Controller**:创建控制器类,使用`@Controller`注解,定义处理请求的方法,使用`@RequestMapping`注解指定...

    最新spring框架学习笔记(全)资料.pdf

    Spring允许与`xxx.properties`格式的配置文件结合使用,首先在XML中注册配置文件,如`&lt;bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;`,然后在其他bean中引用这些属性值,...

    spring-reference.pdf

    九、Spring的配置与扩展 1. **PropertyPlaceholderConfigurer**:用于在配置文件中解析占位符,将占位符替换为实际值。 2. **PropertyOverrideConfigurer**:用于覆盖已存在的Bean定义属性,通常用于环境特定的配置...

    Spring源码学习四:BeanDefinition装载前奏曲1

    在创建`ApplicationContext`实例时,通常会调用带有`configLocations`参数的构造函数,这个参数指定了Spring XML配置文件的位置。例如,`"applicationContext.xml"`就是一个常见的配置文件名。 进入`refresh()`方法...

    spring mvc log4j

    - 使用 `log4jConfigLocation` 参数在 Spring 配置文件中指定 `log4j.properties` 或 `log4j.xml` 文件的位置。 6. **日志级别管理** - 可以在运行时通过修改 Log4j 配置文件,或者使用 `log4j-api` 提供的 API ...

    最新spring框架学习笔记(全)资料 (2).pdf

    Spring框架还支持与`.properties`配置文件的集成,可以用来存储常量或环境相关的配置。通过`PropertyPlaceholderConfigurer` Bean,可以加载`.properties`文件并引用其中的值,这样在其他Bean的配置中就可以动态引用...

    Spring 总结(1) 自用

    在本文中,我们将深入探讨Spring的IoC容器、BeanFactory、ApplicationContext以及依赖注入的不同方式。 首先,IoC(控制反转)是一种设计模式,它将组件之间的依赖关系的管理从对象自身转移到了容器,也就是Spring...

Global site tag (gtag.js) - Google Analytics