PropertyPlaceholderConfigurer的使用

阅读更多

    一、在Spring中,PropertyPlaceholderConfigurer主要是将配置属性值放到一个properties文件中,在xml文件中使用${key}替换properties文件中的值。

    通常数据库配置jdbc.properties就是这样配置的, eg:jdbc.properties如下:

jdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
jdbc.username=admin
jdbc.password=123456

 在xml中引入该配置文件(单个配置文件)


	
		jdbc.properties
	
	
	   UTF-8
    

然后就可以直接用${key}替换配置文件中的属性值


	
	
	
	

  

在xml中引入该配置文件(多个配置文件)


	
		   
			classpath:jdbc.properties
			classpath:inter.properties
		 	classpath:email.properties
		 
	

 当然也可以使用Spring中的这种只能配置一个配置文件,如果需要配置多个需要用通配符:

 


 

    二、自定义PropertyPlaceholderConfigurer

    当java代码中使用了属性值,我们可以自定义PropertyPlaceholderConfigurer来获取属性值,不过当属性值变了,就需要重启容器。因为容器启动的时候,哪些属性值已经初始化了。note:对于不同环境,我们可以使用不同的属性前缀,从而在一定程度上满足因为环境不同导致属性值不一致的问题。代码示例如下:

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

public class SpringPropertiesUtils extends PropertyPlaceholderConfigurer{

	private static Map properties = new HashMap<>();
	//在解析一个占位符的变量的时候。假设不能获取到该变量的值。就会拿系统属性来尝试
	private int systemPropertiesModeName = SYSTEM_PROPERTIES_MODE_FALLBACK;
	
	
	@Override
	public void setSystemPropertiesMode(int systemPropertiesMode) {
		super.setSystemPropertiesMode(systemPropertiesMode);
		this.systemPropertiesModeName = systemPropertiesMode;
	}
	
	@Override
	protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props)
			throws BeansException {
		super.processProperties(beanFactory, props);
		for (Object key : props.keySet()) {
			String keyStr = key.toString();
			String value = resolvePlaceholder(keyStr, props, systemPropertiesModeName);
			properties.put(keyStr, value);
		}
		String env = System.getenv("APPLICATION_ENV");
		if (env != null) {
			properties.put("env", env);
		}
	}
	
	public static Object getProperty(String key) throws Exception{
		return properties.get(key);
	}
	
	public static String getStringProperty(String key) throws Exception{
		Object value = properties.get(key);
		if (value != null) {
			return String.valueOf(value);
		}
		return null;
	}

 在xml文件中配置如下:

	
		
			
	classpath:config/wxconfig.properties
	classpath:config/project.properties
	classpath:conf.properties
			
		
	

 这样在java代码中就可以直接通过getStringProperty(key)读取配置文件中的属性值。

你可能感兴趣的:(PropertyPlaceholderConfigurer的使用)