spring自定义配置文件的加载

开发中,常常有些参数需要放在配置文件中,

简单的使用是使用注解来进行注入,

properties文件中

author_name=luolin 
project_info=\u8BE5\u9879\u76EE\u4E3B\u8981\u662F\u7528\u4E8E\u5199\u4E00\u4E9Bdemo 

xml中:

		<bean id="setting" class="com.ycgwl.kylin.spring.properties.PropertiesFactoryBean">  
			<property name="fileEncoding" value="UTF-8" />
			<property name="ignoreResourceNotFound" value="true" />  
			<property name="locations">  
				<list>  
	               	<value>classpath:conf/application.properties</value> 
	               	<value>classpath:conf/application.dev.properties</value>   
				</list>  
			</property>  
		</bean>
在使用的使用通过value注解进行注入

	@Value("#{setting[author_name]}") 
	private String authorName;
   	@Value("#{setting[project_info]}")  
	private String projectInfo;

简单的说,第一步就是把配置文件生成一个bean,id为setting.在使用的时候注入进来;

第一种很明显是能够满足我们使用的,但是,个人感觉比较高大上的使用方法是使用spring的自定义加载过程来实现该过程:

通过SystemUtils来管理配置文件的属性,而属性的key值放入SystemKey中

public class SystemUtils {
	
	public static final String SEPARATOR = "/"; 

	private static final Map<String, String> properties = new ConcurrentHashMap<String, String>();
	
	/**
	  * @Description: 新增配置项
	  * @param key
	  * @param value
	  * @exception
	 */
	public static void put(String key,String value){
		properties.put(key, value);
	}
	
	/**
	  * @Description: 获取某配置项
	  * @param key
	  * @return
	  * @exception
	 */
	public static String get(String key){
		return properties.get(key);
	}
}
public interface SystemKey {

	String NAME = "author_name";

	String PROJECT = "project_info"
	
}

然后在spring的加载过程中,将属性保存在SystemUtils中的map集合中

public class PropertiesFactoryBean extends  org.springframework.beans.factory.config.PropertiesFactoryBean  {

	private final Logger logger = LoggerFactory.getLogger(PropertiesFactoryBean.class);
	
	@Override
	protected void loadProperties(Properties props) throws IOException {
		super.loadProperties(props);
		logger.info("系统配置信息如下:");
		logger.info("=============================================================================================");
		if(MapUtils.isEmpty(props)){
			logger.info("没有任何配置信息");
		}else{
			for (Map.Entry<Object, Object> entry : props.entrySet()) {
				SystemUtils.put(String.valueOf(entry.getKey()), String.valueOf(entry.getValue()));
				logger.info("{} = {}", entry.getKey(), entry.getValue());
			}
		}
		logger.info("=============================================================================================");
	}
}

当spring启动时,会把配置文件的属性放入SystemUtils中,当需要使用某一个属性的时候可以直接使用SystemUtils.get(SystemKey.NAME )即可获取name的属性;
比加注解方便许多,在分布式的系统中,使用ConcurrentHashMap,可以防止一些并发问题,如果单系统中,可以使用HashMap就好;第一种方法网上较多,第二种暂时没有在网上查到,如果手敲代码可以先理解下就可以正常使用.

 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/alan_waker/article/details/78395333