`

编码方式获取Spring中PropertyPlaceholderConfigurer的属性

阅读更多
applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>name.properties</value>
		</property>
	</bean>
	<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>birthday.properties</value>
		</property>
	</bean>
</beans>

birthday.properties属性文件
birthday=2012-12-12

name.properties属性文件
name=kid

SpringPropertyResourceReader.java
package utils;
import java.lang.reflect.Method;
import java.util.Properties;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.PropertyResourceConfigurer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.support.PropertiesLoaderSupport;
public class SpringPropertyResourceReader {
	private static ApplicationContext applicationContext=new 
	ClassPathXmlApplicationContext("applicationContext.xml");
	private static AbstractApplicationContext abstractContext =
	(AbstractApplicationContext) applicationContext;
	private static Properties properties=new Properties();
	static{
		try{
			// get the names of BeanFactoryPostProcessor
			String[] postProcessorNames = abstractContext
					.getBeanNamesForType(BeanFactoryPostProcessor.class,true,true);
			
			for (String ppName : postProcessorNames) {
				// get the specified BeanFactoryPostProcessor
				BeanFactoryPostProcessor beanProcessor=
				abstractContext.getBean(ppName, BeanFactoryPostProcessor.class);
				// check whether the beanFactoryPostProcessor is 
				// instance of the PropertyResourceConfigurer
				// if it is yes then do the process otherwise continue
				if(beanProcessor instanceof PropertyResourceConfigurer){
					PropertyResourceConfigurer propertyResourceConfigurer=
							(PropertyResourceConfigurer) beanProcessor;
					
					// get the method mergeProperties 
					// in class PropertiesLoaderSupport
					Method mergeProperties=PropertiesLoaderSupport.class.
						getDeclaredMethod("mergeProperties");
					// get the props
					mergeProperties.setAccessible(true);
					Properties props=(Properties) mergeProperties.
					invoke(propertyResourceConfigurer);
					
					// get the method convertProperties 
					// in class PropertyResourceConfigurer
					Method convertProperties=PropertyResourceConfigurer.class.
					getDeclaredMethod("convertProperties", Properties.class);
					// convert properties
					convertProperties.setAccessible(true);
					convertProperties.invoke(propertyResourceConfigurer, props);
					
					properties.putAll(props);
				}
			}
			
		}catch(Exception e){
			throw new RuntimeException(e);
		}
	}
	
	public static String getProperty(String propertyName){
		return properties.getProperty(propertyName);
	}
}

测试代码Main.java
package main;

import utils.SpringPropertyResourceReader;
public class Main {
	public static void main(String[] args) throws Exception {
		System.out.println(SpringPropertyResourceReader.getProperty("name"));
		System.out.println(SpringPropertyResourceReader.getProperty("birthday"));
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics