springBoot动态加载资源文件

在实际项目中资源信息若是可以动态获取在修改线上产品配置时极其方便,下面来展现一个加载动态获取资源的案例,而不是加载写死的properties文件信息。java

首先构造PropertySource,而后将其添加到Enviroment中。web

构造DynamicLoadPropertySource

package com.wangh.test;

import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.MapPropertySource;

/** * 动态加载配置文件 * @ClassName:DynamicLoadPropertySource * @author:Wh * @date: 2017年9月14日 下午3:22:54 */
public class DynamicLoadPropertySource extends MapPropertySource{


    private static Logger log = LoggerFactory.getLogger(DynamicLoadPropertySource.class);
    private static Map<String, Object> map = new ConcurrentHashMap<String, Object>(64); 

    private static ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1);
    static {  
        scheduled.scheduleAtFixedRate(new Runnable() {  
            @Override  
            public void run() {  
                map = dynamicLoadMapInfo();  
            }  
        }, 1, 10, TimeUnit.SECONDS);  
    }  

    /** * @param name * @param source */
    public DynamicLoadPropertySource(String name, Map<String, Object> source) {
        super(name, map);
    }


    @Override  
    public Object getProperty(String name) {  
        return map.get(name);  
    }  

    /** * //动态获取资源信息 * @return */
    protected static Map<String, Object> dynamicLoadMapInfo() {
        return mockMapInfo(); 
    }

    /** * @return */
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
    private static Map<String, Object> mockMapInfo() {
        Map<String, Object> map = new HashMap<String, Object>(); 
        map = getProperties();
        log.info("data{};currentTime:{}", map.get("spring.datasource.url"), sdf.format(new Date())); 
        return map;
    }

    /** * 获取配置文件信息 * @return */
    public static Map<String, Object> getProperties() {

        Properties props = new Properties();
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            InputStream in = ClassLoader.getSystemResourceAsStream("pro.properties");
            props.load(in);
            Enumeration<?> en = props.propertyNames();
            while (en.hasMoreElements()) {
                String key = (String) en.nextElement();
                String property = props.getProperty(key);
                map.put(key, property);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

}

添加到Enviroment

package com.wangh.test;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.AbstractEnvironment;

/** * 加载动态配置信息 * @ClassName:DynamicConfig * @author:Wh * @date: 2017年9月14日 下午3:38:17 */
@Configuration
public class DynamicConfig {
    //资源信息元数据:PropertySource包含name和泛型,一份资源信息存在惟一的name以及对应泛型数据,在这里设计为泛型代表可拓展自定.PropertySource在集合中的惟一性只能去看name
    public static final String DYNAMIC_CONFIG_NAME = "dynamic_config"; 
    @Autowired  
    AbstractEnvironment environment;

    @PostConstruct  
    public void init() {  
        environment.getPropertySources().addFirst(new DynamicLoadPropertySource(DYNAMIC_CONFIG_NAME, null));  
    }  
}