原文转自:http://www.iitshare.com/spring-container-load-custom-configuration-files.html
写作背景

最近做的项目当中遇到这么一个问题,需要将一些参数配置在一个properties文件中,在项目当中动态获取,频繁使用,由于是频繁使用,为了提高性能,我们就想到在项目初始化的时候将其加载到内存里面,类似加载Spring的配置文件一样,我们最后采用的方式是在Tomcat启动加载数据库配置文件的时候,同时加载我们定义的project.properties配置文件,下面将具体的实现方式写出来,和大家共享下

自定义配置文件

配置文件名为:project.properties,内容如下:

# 是否开启逻辑删除
project_del.filter.on=false
project_domain=http://www.366go.cn/


修改Spring配置文件

之前代码:

<beanid="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <propertyname="locations">
        <list>
            <value>classpath:dbinfo.properties</value>
        </list>
    </property>
</bean>


修改后的配置文件

<beanid="propertyConfigurer"
    class="com.hisun.core.util.CustomizedPropertyPlaceholderConfigurer">
    <propertyname="locations">
        <list>
            <value>classpath:dbinfo.properties</value>
            <value>classpath:project.properties</value>
        </list>
    </property>
</bean>


加入了classpath:project.properties,其为自定义的配置文件
将PropertyPlaceholderConfigurer类修改为自定义类CustomizedPropertyPlaceholderConfigurer,
PropertyPlaceholderConfigurer类的具体作用可以查资料这块儿不做详细介绍

注意下:这个configurer类获取的是所有properties的属性map,如果希望处理某个properties文件,需要在properties中

做一个命名区别,然后在加载的时候,根据key的前缀,进行获取。

定义CustomizedPropertyPlaceholderConfigurer类

类的具体内容为下,

importjava.util.HashMap;
importjava.util.Map;
importjava.util.Properties;
 
importorg.springframework.beans.BeansException;
importorg.springframework.beans.factory.config.ConfigurableListableBeanFactory;
importorg.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
 
publicclass CustomizedPropertyPlaceholderConfigurer extendsPropertyPlaceholderConfigurer {
    privatestatic Map ctxPropertiesMap;
 
    @Override
    protectedvoid processProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
                                     Properties props)throws BeansException {
        super.processProperties(beanFactoryToProcess, props);
        ctxPropertiesMap =new HashMap();
        for(Object key : props.keySet()) {
            String keyStr = key.toString();
	if(keyStr.startsWith("project_")){
           String value = props.getProperty(keyStr);
           ctxPropertiesMap.put(keyStr, value);
        }

        }
    }
    publicstatic Object getContextProperty(String name) {
        returnctxPropertiesMap.get(name);
    }
}


定义获取配置文件中值的类SpringPropertiesUtil

类的具体内容如下:

importorg.springframework.beans.BeansException;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.ApplicationContextAware;
importorg.springframework.stereotype.Component;
 
/**
 * Spring-PropertiesUtil工具类 -获取属性值
 *
 */
@Component
publicclass SpringPropertiesUtil implementsApplicationContextAware {
    publicstatic final String KEY = "propertyConfigurer";
    privatestatic ApplicationContext applicationContext;
 
    publicvoid setApplicationContext(ApplicationContext applicationContext)
            throwsBeansException {
        SpringPropertiesUtil.applicationContext = applicationContext;
    }
 
    publicstatic ApplicationContext getApplicationContext() {
        returnapplicationContext;
    }
 
    /**
     * 获取配置文件中的内容
     *
     * @param keyName
     * @return
     */
    publicstatic String parseStr(String keyName) {
        CustomizedPropertyPlaceholderConfigurer cp = (CustomizedPropertyPlaceholderConfigurer) applicationContext
                .getBean(KEY);
        returncp.getContextProperty(keyName).toString();
    }
 
    /**
     * 获取配置文件中的内容
     *
     * @param keyName
     * @return
     */
    publicstatic int parseInt(String keyName) {
        CustomizedPropertyPlaceholderConfigurer cp = (CustomizedPropertyPlaceholderConfigurer) applicationContext
                .getBean(KEY);
        returnInteger.parseInt(cp.getContextProperty(keyName).toString());
    }
 
    /**
     * 获取配置文件中的内容
     *
     * @param keyName
     * @return
     */
    publicstatic double parseDouble(String keyName) {
        CustomizedPropertyPlaceholderConfigurer cp = (CustomizedPropertyPlaceholderConfigurer) applicationContext
                .getBean(KEY);
        returnDouble.parseDouble(cp.getContextProperty(keyName).toString());
    }
}


这样,在项目当中就能够方便快速的获取properties文件中配置的参数
如SpringPropertiesUtil.parseStr(“content”)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐