springBoot如何动态加载资源文件

目录
  • springBoot动态加载资源文件
    • 构造DynamicLoadPropertySource
    • 添加到Enviroment
  • 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

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

(0)

相关推荐

  • spring boot 配置动态刷新实现详解

    本文测试使用的spring cloud版本为: Dalston.SR1 很多朋友只知道spring cloud config可以刷新远程git的配置到内存中, 却不知道spring cloud config的客户端可以脱离服务端使用, 更不知道spring cloud config客户端结合actuator还可以刷新本地的配置文件到内存中. 具体做法如下: 1.pom: <?xml version="1.0" encoding="UTF-8"?> <

  • 简单了解springboot加载配置文件顺序

    1.目录结构 Application属性文件,按优先级排序,位置高的将覆盖位置 当前项目目录下的一个/config子目录 当前项目目录 项目的resources即一个classpath下的/config包 项目的resources即classpath根路径(root) 二.读取顺序 如果在不同的目录中存在多个配置文件,它的读取顺序是: 1.config/application.properties(项目根目录中config目录下) 2.config/application.yml 3.appli

  • 详解Spring Boot 配置加载顺序及属性加载顺序

    先给大家介绍下spring boot 配置加载顺序,具体内容如下所示: 使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 Spring Boot 里面,可以使用以下几种方式来加载配置.本章内容基于 Spring Boot 2.0 进行详解. 1.properties文件: 2.YAML文件: 3.系统环境变量: 4.命令行参数: 等等-- 我们可

  • Spring boot 应用实现动态刷新配置详解

    目录 1. 依赖 2. 配置暴露接口 3. @RefreshScope 4. 启动服务 5. 修改配置 6. 获取配置值 7. 刷新配置 重新获取 总结 参考:https://www.cnblogs.com/flying607/p/8459397.html 文章使用springboot版本:2.0.4.RELEASE springcloud版本Finchley.SR1 1. 依赖 需要引入下面三个依赖: compile('org.springframework.cloud:spring-clou

  • springBoot如何动态加载资源文件

    目录 springBoot动态加载资源文件 构造DynamicLoadPropertySource 添加到Enviroment springBoot静态资源动态加载 举例说明 springBoot动态加载资源文件 在实际项目中资源信息如果能够动态获取在修改线上产品配置时极其方便,下面来展示一个加载动态获取资源的案例,而不是加载写死的properties文件信息. 首先构造PropertySource,然后将其添加到Enviroment中. 构造DynamicLoadPropertySource

  • 动态加载JavaScript文件的两种方法

    这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下 第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval()实施代码.第二种是,动静创建一个script标签,配置其src属性,经过把script标签插入到页面head来加载js,相当于正在head中写了一个<script src="..."></script>,只可是这个script标签是用js动静创建的 比喻说是我们

  • 详谈LABJS按需动态加载js文件

    LABjs 是一个很小的 JavaScript 工具,用来根据需要加载 JavaScript 文件,通过使用该工具可以提升页面的性能,避免加载不需用到的 JavaScript 文件,可以实现动态并行加载脚本文件,以及管理加载脚本文件的执行顺序. 简单示例 $LAB .script("script1.js", "script2.js", "script3.js") .block(function(){ // wait for all to load

  • Java加载资源文件时的路径问题的解决办法

    加载资源文件比较常用的有两种: 一.用ClassLoader,说到这里就不得不提一下ClassLoader的分类,java内置的ClassLoader主要有三种, 第一种是根类加载器(bootstrap class loader),用C++来编写,负责将一些关键的Java类,如java.lang.Object和其他一些运行时代码先加载进内存中. 所负责加载的包:BootStrp------>JRE/lib/rt.jar 第二种是扩展类加载器(ExtClassLoader),由java类编写,负责

  • JS 动态加载js文件和css文件 同步/异步的两种简单方式

    /*动态添加js或css,URL:文件路径,FileType:文件类型(js/css)*/ function AddJsFiles(URL,FileType){ var oHead = document.getElementsByTagName('HEAD').item(0); var addheadfile; if(FileType=="js"){ addheadfile= document.createElement("script"); addheadfile

  • 动态加载js文件简单示例

    本文实例讲述了动态加载js文件的方法.分享给大家供大家参考,具体如下: function loadScript(url){ var hd = document.getElementsByTagName('head')[0], js = document.createElement('script'); js.src = url; js.type = "text/JavaScript"; if(js.addEventListener){ js.addEventListener("

  • jquery及js实现动态加载js文件的方法

    本文实例讲述了jquery及js实现动态加载js文件的方法.分享给大家供大家参考,具体如下: 问题: 如果用jquery append直接加载script标签的话,会报错的.除了document.write外,还有没有其他的比较好的动态加载js文件的方法. 解决方法: 1.jquery方法 $.getScript("./test.js"); //加载js文件 $.getScript("./test.js",function(){ //加载test.js,成功后,并执

  • js加载之使用DOM方法动态加载Javascript文件

    传统上,加载Javascript文件都是使用<script>标签. 就像下面这样: <script type="text/javascript" src="example.js"></script> <script>标签很方便,只要加入网页,浏览器就会读取并运行.但是,它存在一些严重的缺陷. (1)严格的读取顺序.由于浏览器按照<script>在网页中出现的顺序,读取Javascript文件,然后立即运行,

  • c# 动态加载dll文件,并实现调用其中的简单方法

    以下是测试代码: 新建一个classlibrary,包含两个类class1和class2,这两个类中分别有一个方法,都是返回一个字符串,代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace mydll { public class Class1 { public Class1() { } public string sayhello() { ret

  • c# 动态加载dll文件,并实现调用其中的方法(推荐)

    以下是测试代码: 新建一个classlibrary,包含两个类class1和class2,这两个类中分别有一个方法,都是返回一个字符串,代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace mydll { public class Class1 { public Class1() { } public string sayhello() { ret

随机推荐