【玩转SpringBoot】看似复杂的Environment其实很简单

本文深入解析SpringBoot的Environment,探讨配置属性的来源和处理,包括System.getenv()、System.getProperties(),以及如何通过PropertySource和Environment进行管理。文章介绍了Profile的概念,用于适应不同环境,并展示了在SpringBoot中Environment的具体实现,包括不同环境下的属性来源和优先级。
摘要由CSDN通过智能技术生成

喜欢写代码,讨厌配环境


我相信这十个字的小标题代表了大多数码农的心声。

十年前读大学时,学校开设了C语言还有C++。但是学习这两种语言,对于新手来说非常没有成就感。

于是我就在校门口买个光盘,装个VS(宇宙第一IDE),还有离线中文版MSDN(最牛的帮助文档),万事已俱备。

学习C#语法,看类的API,然后从WinForm(窗口)开始,用鼠标拖拽控件,设置控件属性,观察自动生成的代码,开启人生的编程之路。

大四的时候接触到Java,首先就是配置环境变量,那时觉得是一个巨复杂的东西,每次都要网上搜好一会儿才能配好。

我学习微软的东西从来就不要配什么环境变量,心里很讨厌这个Java的环境变量,这就导致十年后的今天,我依然要去网上搜如何配置,惭愧惭愧,哈哈。

后来发现,基本上软件都要配置一些环境变量,只不过有的是在安装时已经自动配好了而已,但是对于免安装版(直接解压)的则需要自己配。


我们也来尝试下抽象


熟悉Java的都知道,Java里面有两个内置的配置集合,就是System.getenv()和System.getProperties()。

它们分别是系统环境和系统属性,如下图01:


一个是Map类型,一个是Properties类型,说明它们都是一些key-value形式的值。

而且Properties类型是Java里的标准配置方式,它就对应于*.properties文件。

至此,我们已经发现两个问题:

1)配置项都是以key-value形式存在的。

2)配置项的来源是多样化的,如现在的系统环境、系统属性、配置文件等,后期还可能会有其它。

对于配置项的多来源问题,有以下两种方式解决:

1)可以把所有来源都暴露给用户,这样使用起来更加精细,但是也会带来困扰,可能用户也会迷糊到底该去哪个来源取值。

2)在所有来源前面加一个“门面”,只把它暴露出去,用户看到的只是“单一来源”,就从这里取值,其它的啥也不用知道。

Spring选择的是第二种方案,拿到key后,只需依次去每个来源中查找,这时只需规定下多个来源之间的优先级顺序即可。

整体可以用一个图形表示,如下图02:


这整体也是一种封装变化的思想,底层的多来源问题被封装起来,对用户不可见。

最终用户传过来一个key,我给返回一个和它对应的value就行了。


来来来,认识两个朋友


配置项在Java中通常叫做属性,即Property。每一个来源其实就是一个源泉,即Source。

所以在Spring中就用PropertySource类来表示一个来源,如下图03:


注意两个字段,name和source,name就是为每个源起个名字。source表示真正的资源,是能从中取出value的东西。

然后需要一个门面把多个来源封装起来,如下图04:


可以看到它里面有一个来源的列表。这就是封装。而且还是有顺序的。

根据key取值就依次遍历所有源即可,如下图05:


如果所有源中都没找到,返回null就行了。

这样配置项(或配置属性)的问题就已经解决了,很简单吧。


除了配置属性外,还有Profile


配置属性是一个很泛化的概念,说白了它就表示以非写代码的方式从外界向程序中传递特定的值。

它的好处就是修改起来很容易,只需修改下配置文件或命令行参数,然后最多重启一下就可以了。

不用修改代码,自然不用重新编译,当然也不用重新打包发布。

泛化其实就表示囊括所有的意思,但是总会有一些特殊情形,值得单独拿出来特别对待。

如每个软件都会至少经历开发、测试、上线这三个阶段,同样也会有三套环境,即开发环境、测试环境、生产环境。

这里的“环境”其实就是一个特殊情况,我们把它单独拿出来,就叫做Profile。

对不同的环境设置不同的Profile,程序中可以读取到Profile,这样程序就可以适应不同的Profile,展示不同的特性。

最终就可以一套代码打天下。就像华为的一套操作系统适应所有的终端设备。就像Java的一份字节码运行在不同的操作系统上。

在不指定Profile时,通常应该有一个默认的Profile。就像汽车默认是运行在城市道路上一样。

在Spring中,默认的Profile就叫做default。如下图06:


这个default可能没有什么意义,所以Spring提供了修改它的机会,如下图07:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值