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 map = new ConcurrentHashMap(64); private static ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1); static {scheduled.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {map = dynamicLoadMapInfo(); }}, 1, 10, TimeUnit.SECONDS); }/*** @param name* @param source*/public DynamicLoadPropertySource(String name, Map source) {super(name, map); }@Overridepublic Object getProperty(String name) {return map.get(name); }/*** //动态获取资源信息* @return*/protected static Map dynamicLoadMapInfo() {return mockMapInfo(); }/*** @return*/private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); private static Map mockMapInfo() {Map map = new HashMap(); map = getProperties(); log.info("data{}; currentTime:{}", map.get("spring.datasource.url"), sdf.format(new Date())); return map; }/*** 获取配置文件信息* @return*/public static Map getProperties() {Properties props = new Properties(); Map map = new HashMap(); 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 */@Configurationpublic class DynamicConfig {//资源信息元数据:PropertySource包含name和泛型,一份资源信息存在唯一的name以及对应泛型数据,在这里设计为泛型表明可拓展自定.PropertySource在集合中的唯一性只能去看namepublic static final String DYNAMIC_CONFIG_NAME = "dynamic_config"; @AutowiredAbstractEnvironment environment; @PostConstructpublic 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}/reportspring.mvc.static-path-pattern=/resources/**
spring.http.encoding.force=true
添加该配置解决中文乱码问题- http://localhost:8080/resources/1.html
推荐阅读
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 如何寻找情感问答App的分析切入点
- Activiti(一)SpringBoot2集成Activiti6
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus使用queryWrapper如何实现复杂查询
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 如何在Mac中的文件选择框中打开系统隐藏文件夹
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- java中如何实现重建二叉树