对集合变量定义赋值_SpringBoot配置加载原理(自定义加载配置)
前言
在SpringBoot应用程序中会有很多的地方定义配置文件,如:
bootstrap.properties
application.properties
或者是SpringCloud中定义的远程配置中心,在这些地方我们只需要定义好我们的配置属性,然后在代码中使用如下的两个注解就可以使用了:
@Value(${server.port})--只能给一个属性赋值
@ConfigurationProperties(prefix = "spring.datasource.druid")--可以将此前缀的属性自动赋值给一个bean的属性。
下面讲下配置加载的原理,知道原理后,我们就可以将任何远程的配置或者是自定义的配置加载到应用程式中,然后就可以只用@Value和@ConfigurationProperties注解使用。
原理
先看一下SpringBoot中关于属性的几个重要的类:
ConfigurableEnvironment--接口1.定义了可以添加和设置活跃的profile文件(默认只有一个,可以调用此方法设置几个活跃的配置文件)。2.获取环境变量。--操作系统的变量3.获取系统变量。--java层面的启动变量4.MutablePropertySources getPropertySources()这个方法重点关注,后面会用到,能获取到所有配置信息。5.MutablePropertySources这个类里面有个list集合,用于存放所有的配置。6.只要将配置信息加入到MutablePropertySources的list集合中,我们就可以使用了(重点,重点,重点)。
ConfigurableEnvironment接口
来一张图直观一些,就是加载各种配置
MutablePropertySources1.有一个list属性private final List> propertySourceList = new CopyOnWriteArrayList<>();2.PropertySource就是具体的配置,我们的任务就是把我们的配置信息构造成PropertySource对象,然后加入到这个list当中去。
PropertySource1.有两个重要属性protected final String name;--配置定义的名称protected final T source;--具体配置信息
例子
如果要实现动态的将配置信息添加到应用程序中,我们需要定义一个EnvironmentPostProcessor的实现类。Talk is cheap,show me the code...
@Slf4j public class CustomEnvironmentPostProcessor implements EnvironmentPostProcessor { PropertiesPropertySourceLoader load=new PropertiesPropertySourceLoader(); //可以将.properties的配置文件加载进来 @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { MutablePropertySources propertySources =environment.getPropertySources(); //获取到MutablePropertySources对象 Resource resource=new ClassPathResource("custom.properties"); //自定义的配置文件,具体位置如下图 try { PropertySource propertySource=load.load("customProperties",resource).get(0); //生成PropertySource对象 propertySources.addFirst(propertySource); //将我们的PropertySource对象加入到集合中 } catch (IOException e) { e.printStackTrace(); } }}
记得要在META-INF下的spring.factories(没有手动创建)文件添加EnvironmentPostProcessor实现类的定义
这样服务启动之后,在custom.properties定义的任何配置信息,都可以使用@Value和@ConfigurationProperties注解使用。Spring Cloud的各种配置中心也是这个原理实现的,PropertySource这个顶层抽象定义了配置资源,我们只需要创建配置资源具体对象,然后加入到MutablePropertySources的集合属性中即可。
后续再说明下如何加载各个位置的配置资源...
后续补充:
上面的例子中使用到了PropertiesPropertySourceLoader来加载配置文件,其实还有如下的类可以加载
PropertySourceLoader--接口
PropertiesPropertySourceLoader--实现类(例子中使用到的),加载.properties
YamlPropertySourceLoader--实现类,加载.yaml配置
它们的load()方法需要2个参数
load(String name, Resource resource)
name--我们可以随意改名字
Resource--资源的实现类,有如下的可以使用
对集合变量定义赋值_SpringBoot配置加载原理(自定义加载配置)相关推荐
- Node 之 模块加载原理与加载方式
Node.js中的模块可以分为原生模块和文件模块,通过Node.js中可以通过require方法导入模块.exports方法导出模块. 1.require导入模块 对于原生模块(比如说:http),只 ...
- python怎么定义一个数字_Python数字变量定义赋值
一.任务描述 本实验的任务主要对Python的变量赋值进行基本操作,通过完成本实验任务,要求学生熟练掌握Python的变量赋值与定义,并对Python变量的基本操作进行整理并填写工作任务报告. 二.任 ...
- aop注解配置切点 spring_Spring通过自定义注解灵活配置AOP切点
package com.lsz.config.enums; import java.lang.annotation.ElementType; import java.lang.annotation.R ...
- Maya ACES工作流程配置(Arnold 及 RedShift 贴图配置规范-还原出SP-Aces流程下贴图正确的效果) PS还原Aces流程下渲染的图
Maya 自身Aces的配置设置: 1.Aces_1.2\config.ocio 文件配置: 这个文件百度一下很多方式获得,也可以从SP安装目录里面的获得: 2.贴图色彩空间的设置,参考下图:(注:A ...
- Pycharm 一键加引号,快速加引号,批量加引号
Pycharm 一键加引号,快速加引号,批量加引号,自定义加引号 最近因为工作需要写了点脚本,有时候在爬取的时候需要将浏览器中的Hearders 复制到Pycharm中使用, 但是复制过来的格式不是需 ...
- python变量定义必须赋值_Python3单行定义多个变量或赋值方法
Python3单行定义多个变量或赋值方法 你甚至可以在一行内将多个值赋值给多个变量 >>> a , b = 45, 54 >>> a 45 >>> ...
- python定义变量并赋值_Python 变量类型及变量赋值
在 Python 中,变量不一定占用内存变量.变量就像是对某一处内存的引用,可以通过变量访问到其所指向的内存中的值,并且可以让变量指向其他的内存.在 Python 中,变量不需要声明,但是使用变量之前 ...
- 你还认识变量吗?Java基础学习不可略过的基本语法,简而不漏,变量的定义赋值和分类,系统认识Java中的变量有哪些?
文章目录 变量的声明和赋值 变量分类 变量的声明和赋值 class VariableTest{public static void main(String[] args) {//变量的定义int my ...
- MySQL中变量的定义和变量的赋值使用
MySQL中变量的定义和变量的赋值使用 前言 MySQL存储过程中,定义变量有两种方式: 1.使用set或select直接赋值,变量名以@开头 例如: set @var=1; 可以在一个会话的任何地方 ...
最新文章
- 你的大脑在自动驾驶,而你一无所知
- 最大流问题的Ford-Fulkerson模板
- (十四)Java springcloud B2B2C o2o多用户商城 springcloud架构- Spring Cloud构建分布式电子商务平台...
- oidc_使用Java EE和OIDC构建Java REST API
- Java提高篇 —— Java三大特性之封装
- 李宏毅机器学习(二)自注意力机制
- linux进程磁盘io监测,系统性能检测--磁盘io
- Shiro 综合实例
- iOS原生的AVFoundation扫描二维码/条形码
- 深入理解Yii2.0 (2)事件Event
- (1) 还原二叉树 (25 分)
- 基于模型驱动低代码平台的实现原理
- 记一次Spark中 Container killed by YARN for exceeding memory limits的解决过程
- 我是云南的云南怒江的是什么梗 我是云南的云南怒江的梗出处
- 微博爬虫及简单数据分析
- 什么?这个岗位薪资秒杀一众程序员?
- 电脑如何进入bios设置?
- 西部数据移动硬盘检测与分区
- 美团饿了吗CPS红包,别人领红包下单,你拿推广佣金(送源码)
- github 链接域名