springBoot如何动态加载资源文件

 更新时间:2021年12月15日 10:25:50   作者:wangtuoyuan  
这篇文章主要介绍了springBoot如何动态加载资源文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

springBoot动态加载资源文件

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

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

构造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));  
    }  
}

springBoot静态资源动态加载

  • spring.resources.static-locations 表示读取静态资源的位置
  • spring.mvc.static-path-pattern 表示读取静态资源路径

举例说明

spring.resources.static-locations=file:${user.home}/report
spring.mvc.static-path-pattern=/resources/**
  • spring.http.encoding.force=true 添加该配置解决中文乱码问题
  • http://localhost:8080/resources/1.html

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中文件的读写方法之IO流详解

    Java中文件的读写方法之IO流详解

    这篇文章主要介绍了Java中文件的读写方法之IO流详解,本文中的代码所涉及到的路径或者文件都是本人的,大家得换成自己的,并且大家可以在网上自行找一些材料作为读入或者写入的材料,不过路径最好是英文的,不要包含中文,防止JVM读取失败
    2022-04-04
  • MyBatis-Plus 分页不生效的解决方法

    MyBatis-Plus 分页不生效的解决方法

    本文主要介绍了MyBatis-Plus 分页不生效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • java 多线程实现在线咨询(udp)

    java 多线程实现在线咨询(udp)

    这篇文章主要介绍了java 多线程实现在线咨询(udp)的示例,帮助大家更好的理解和学习Java 网络编程的相关内容,感兴趣的朋友可以了解下
    2020-11-11
  • Java中Map与对象之间互相转换的几种常用方式

    Java中Map与对象之间互相转换的几种常用方式

    在Java中将对象和Map相互转换是常见的操作,可以通过不同的方式实现这种转换,下面这篇文章主要给大家介绍了关于Java中Map与对象之间互相转换的几种常用方式,需要的朋友可以参考下
    2024-01-01
  • 基于OpenCv与JVM实现加载保存图像功能(JAVA 图像处理)

    基于OpenCv与JVM实现加载保存图像功能(JAVA 图像处理)

    openCv有一个名imread的简单函数,用于从文件中读取图像,本文给大家介绍JAVA 图像处理基于OpenCv与JVM实现加载保存图像功能,感兴趣的朋友一起看看吧
    2022-01-01
  • mybatis之嵌套查询和嵌套结果有哪些区别

    mybatis之嵌套查询和嵌套结果有哪些区别

    这篇文章主要介绍了mybatis之嵌套查询和嵌套结果有哪些区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • MyBatis如何调用存储过程与存储函数

    MyBatis如何调用存储过程与存储函数

    这篇文章主要介绍了MyBatis如何调用存储过程与存储函数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java固定大小队列的几种实现方式详解

    java固定大小队列的几种实现方式详解

    队列的特点是节点的排队次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,这篇文章主要给大家介绍了关于java固定大小队列的几种实现方式,需要的朋友可以参考下
    2021-07-07
  • java远程调用接口、URL的方式代码

    java远程调用接口、URL的方式代码

    我们都知道接口有自己本地的,也有远程别人写好的,而调用远程接口的就需要使用远程调用啦,这篇文章主要给大家介绍了关于java远程调用接口、URL的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • mybatis 有时update语句执行无效的解决方案

    mybatis 有时update语句执行无效的解决方案

    这篇文章主要介绍了在项目里mybatis有时update语句执行无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论