Spring技巧之如何动态读取配置文件

目录
  • Spring 动态读取配置文件
    • 需求背景
    • 方案一
    • 方案二
    • 方案三
  • 动态读取配置文件中的信息
    • 1、首先是写一个配置文件,方便动态加载
    • 1、利用类加载器等读取配置文件

Spring 动态读取配置文件

需求背景

最近碰到的需求大概是这样,我们要在一个现有的项目基础上进行二次开发,但又不愿意碰原有项目里的代码。所以采用了Maven依赖的方式——新建一个Maven项目作为主要开发环境,将原有项目作为Maven依赖(war形式)引入进来。这样在新建的扩展项目中打包出来的war将会是合并两个项目的所有代码。

而在实际搭建的过程中碰到这样一个问题,Spring配置文件中的 <context:property-placeholder />只允许存在一个, 而且这个机会已经被原有项目使用了——这种说法并不严谨,所以以下给出三种解决方案:

方案一

以上关于<context:property-placeholder />的说法并不严谨,其实多次添加也不会报错; 但只会有一个生效(含义是 如果spring从所设置的配置文件集合中没有读取到属性去替换占位符,就会报错, 除非设置 ignore-unresolvable ) ,如果按照如下设置方式,就可以避免这种情况,并接触本次需求。

<!-- 如果要配置多个, 就要设置ignore-unresolvable ="true" -->
<context:property-placeholder location="classpath:extend/db.properties" ignore-unresolvable="true" />
<context:property-placeholder location="classpath:db.properties" ignore-unresolvable="true" />

但是这样带来的坏处就是:

1. 将发现错误的时机推迟到了运行时,这在系统比较庞大时实在是大忌。

2. 属性重复时的替换危机,这种BUG想要找出来,耗费的时间和精力想想就不寒而栗。

方案二

第二个方法 就是BeanFactoryPostProcessor接口,注意该接口的回调时机早于占位符替换 操作。

// BeanFactoryPostProcessor.postProcessBeanFactory
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    // 我们自己去读取指定的配置文件
    Properties prop = null ;
    try {
        prop = PropertiesLoaderUtils.loadAllProperties("extend/db.properties", Thread.currentThread().getContextClassLoader());
    } catch (IOException e) {
        e.printStackTrace();
    }
    if(null == prop){
        return;
    }
    // 注入到特定的Bean的特定属性中
    BeanDefinition beanDefinition = beanFactory.getBeanDefinition("dataSource_extend");
    beanDefinition.getPropertyValues().add("url", prop.getProperty("db.sd.url"));
    beanDefinition.getPropertyValues().add("driverClassName",prop.getProperty("db.sd.driverClassName"));
    beanDefinition.getPropertyValues().add("username", prop.getProperty("db.sd.username"));
    beanDefinition.getPropertyValues().add("password", prop.getProperty("db.sd.password"));
    super.postProcessBeanFactory(beanFactory);
}

方案三

还有一种方法就是使用Spring的父子容器的关系,将这个 <context:property-placeholder/>和依赖它的Bean全部注册到一个全新容器中,然后将该容器作为现有容器的Parent。此方法过去取巧,本人没有实际去尝试。

动态读取配置文件中的信息

1、首先是写一个配置文件,方便动态加载

jedis.properties

key-value形式保存

1、利用类加载器等读取配置文件

1.读取配置文件

InputStream is=JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");

2.创建properties对象

Properteis pro=new Properties();

3.关联文件

pro.load(is);

4.然后在项目中可以动态加载key获取到value值

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

时间: 2021-09-13

Springboot如何获取配置文件application.yml中自定义的变量并使用

前言:在写项目中我们经常要将同样的变量在不同的文件中写无数次,这样修改起来要一通好找,非常不方便,平常都会写一个工具类存入自己的变量进行调用取值,但是呢,懒得写咋办,写了还要注入,注入失败又得.........麻烦,有没有办法写在配置文件中直接自定义变量通过注解的方式取值呢?肯定有啊. 正文: 一.在application.yml中配置自己的变量比如: person: name: '张三' age: '年龄25' home: '拥有房子1套' car: '轿车1辆' 二.使用注解取值并且使用 i

Springboot使用@RefreshScope注解实现配置文件的动态加载

目录 pom.xml properties 启动类 配置类 controller 打包 springcloud对应的springboot版本 参考: spring-boot-starter-actuator提供服务健康检查和暴露内置的url接口. spring-cloud-starter-config提供动态刷新的一些支持和注解. pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xml

Spring Boot 指定外部启动配置文件详解

目录 使用spring boot默认的配置文件路径 指定外部的配置文件 特定配置 总结 默认的打包spring boot项目会把配置文件打到jar包中,有时候在测试时需要想修改某些配置项.这时除了可以用启动参数覆盖配置项以外,还可以指定外部的配置文件覆盖已有配置文件.在需要修改较多配置参数的时候会很方便. 使用spring boot默认的配置文件路径 默认的查找路径如下: 1.file:./config/ 2.file:./ 3.classpath:/config/ 4.classpath:/

使用springboot配置文件yml中的map形式

目录 springboot配置文件yml的map形式 1.yml中的格式 2.创建一个类 3.引用 4.打印 SpringBoot yaml文件map集合使用 yaml文件配置 配置文件对应的bean springboot配置文件yml的map形式 1.yml中的格式 tes: maps: {key1: 12,key2: 34} 或者 tes: maps: key1: 15 key2: 2 2.创建一个类 然后创建对应类型的字段(注意下这个类的那两个注释了的注解) package com.etc

Springboot之日志、配置文件、接口数据如何脱敏

目录 一.前言 二.配置文件如何脱敏? 1. 添加依赖 2. 配置秘钥 3. 生成加密后的数据 4. 将加密后的密文写入配置 5. 总结 三.接口返回数据如何脱敏? 1. 自定义一个Jackson注解 2. 定制脱敏策略 3. 定制JSON序列化实现 4. 定义Person类,对其数据脱敏 5. 模拟接口测试 6. 总结 四.日志文件如何数据脱敏? 1. 添加log4j2日志依赖 2. 在/resource目录下新建log4j2.xml配置 3. 自定义PatternLayout实现数据脱敏 4

SpringBoot 配置文件加载位置与优先级问题详解

[1]项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 –file:./config/ –file:./ –classpath:/config/ –classpath:/ 即如下图所示: 以上是按照优先级从高到低(1-4)的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容. SpringBoot会从这四个位置全部加载主配置文件,如果高优先级

SpringBoot配置加载,各配置文件优先级对比方式

目录 1.SpringBoot配置文件 以设置应用端口为例 2.配置文件目录 3.自定义配置属性 自定义配置提示 4.指定配置文件 @PropertySource使用 装配yaml配置文件 @ImportResource使用 其他问题 idea使用*.properties文件出现中文乱码问题? 解决方法: 1.SpringBoot配置文件 SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件.支持properties后缀结尾的配置文件或者以yml/yaml后缀

spring boot启动时加载外部配置文件的方法

前言 相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.本文主要给大家介绍了关于spring boot启动时加载外部配置文件的相关内容,下面话不多说了,来随着小编一起学习学习吧. 业务需求: 加载外部配置文件,部署时更改比较方便. 先上代码: @SpringBootApplication public class Application { public static void main(String[] args) throws Exce

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

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

Java实现配置加载机制

前言 现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty...等等数都数不过来的软件, 要满足通用性,都会提供配置文件供使用者定制功能. 甚至有一些例如Netty这样的网络框架,几乎完全就是由配置驱动,这样的软件我们也通常称之为"微内核架构"的软件. 你把它配置成什么,它就是什么. It is what you configure it to be. 最常见的配置文件格式是XML, Properties等等文件. 本文探讨加载配置中最通用也是最

Java 配置加载机制详解及实例

前言 现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty-等等数都数不过来的软件,要满足通用性,都会提供配置文件供使用者定制功能. 甚至有一些例如Netty这样的网络框架,几乎完全就是由配置驱动,这样的软件我们也通常称之为"微内核架构"的软件.你把它配置成什么,它就是什么. It is what you configure it to be. 最常见的配置文件格式是XML, Properties等等文件. 本文探讨加载配置中最通用也是最常见的场

Thinkphp 框架配置操作之配置加载与读取配置实例分析

本文实例讲述了Thinkphp 框架配置操作之配置加载与读取配置.分享给大家供大家参考,具体如下: 配置加载 在ThinkPHP中,一般来说应用的配置文件是自动加载的,加载的顺序是: 惯例配置->应用配置->模式配置->调试配置->状态配置->模块配置->扩展配置->动态配置 以上是配置文件的加载顺序,因为后面的配置会覆盖之前的同名配置(在没有生效的前提下),所以配置的优先顺序从右到左. 不同的配置文件的区别和位置: 惯例配置 惯例重于配置是系统遵循的一个重要思想

springboot动态加载Echarts柱状图

本文实例为大家分享了springboot动态加载Echarts柱状图的具体代码,供大家参考,具体内容如下 第一次写博客,废话不多说,直接上代码 后台代码 @RequestMapping("/rcbchart") @ResponseBody private String dwcb(@RequestParam("scrq1") String scrq1,@RequestParam("scrq2") String scrq2, @RequestPara

Django添加bootstrap框架时无法加载静态文件的解决方式

项目结构如下: 开始时在setting.py中设置如下; html文件中的写法如下: 这样设置一直无法加载静态文件,只需要修改setting.py文件如下: 就可以加载到静态文件了. 补充知识:Django-项目上线后,静态文件配置失效以及404.500页面的全局配置 一.项目上线后静态文件失效 1.因为项目还没上线的时候,django会默认从setting.py中这个设置 STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BAS

详解使用Vue.Js结合Jquery Ajax加载数据的两种方式

整理文档,搜刮出一个使用Vue.Js结合Jquery Ajax加载数据的两种方式的代码,稍微整理精简一下做下分享. 废话不多说,直接上代码 html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>demo</title> <script src="js/jquery.js"

jquery加载图片时以淡入方式显示的方法

本文实例讲述了jquery加载图片时以淡入方式显示的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title></title> </head> <script type="text/java

Vue加载组件、动态加载组件的几种方式

什么是组件: 组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展. 下面一段简单的代码给大家介绍Vue加载组件的几种方式,具体代码如下所示: //正常加载 import index from '../pages/index.vue' import view from '../pages/view.vue' //懒加载 const i