Spring中的Environment外部化配置管理详解 (2)

在spring boot应用中,默认的外部化配置是application.properties文件,事实上,除了这个默认的配置文件之外,我们还可以使用springboot中的约定命名格式来实现不同环境的配置

application-profile.properties

当前spring boot应用选择使用哪个properties文件作为上下文环境配置,取决与当前激活的profile。同样,我们可以通过很多种方式来激活,比如在application.properties中增加spring.profiles.active=dev这种方式,也可以在JVM参数中增加该配置来指定生效的配置。

在不指定的情况下,则使用默认的配置文件,简单来说,如果没有显式激活某一个配置文件,那么应用程序就将加载application-default.properties中的属性。

这个功能非常实用,一般的公司里面都会有几套运行环境,比如开发、测试、生产环境,这些环境中会有一些配置信息是不同的,比如服务器地址。那我们需要针对不同的环境使用指定的配置信息,通过这种方式就可以很方便的去解决。

@Value注解的使用

在properties文件中定义的属性,除了可以通过environment的getProperty方法获取之外,spring还提供了@Value注解,

@RestController public class EnvironementController { @Value("${env}") private String env; @GetMapping("/env") public String env(){ return env; } }

spring容器在加载一个bean时,当发现这个Bean中有@Value注解时,那么它可以从Environment中将属性值进行注入,如果Environment中没有这个属性,则会报错。

Spring Environment原理设计

结合前面咱们讲过的内容,我们来推测一下Environment的实现原理。

简单演示一下Environment中的配置来源

@Value("${java.version}") 获取System.getProperties , 获取系统属性

配置command的jvm参数, -Denvtest=command

基于现有的内容的推导,我们可以画出下面这样一个图。

image-20211216204620415

第一部分是属性定义,这个属性定义可以来自于很多地方,比如application.properties、或者系统环境变量等。

然后根据约定的方式去指定路径或者指定范围去加载这些配置,保存到内存中。

最后,我们可以根据指定的key从缓存中去查找这个值。

下面这个是表示Environment的类关系图,这个类关系图还是非常清晰的体现了Environment的原理。

image-20211216210040646

上述类图的核心API说明如下

Environment接口,继承了PropertyResolver。 PropertyResolver,它主要有两个作用。

通过propertyName属性名获取与之对应的propertValue属性值(getProperty)。

把${propertyName:defaultValue}格式的属性占位符,替换为实际的值(resolvePlaceholders)。

PropertyResolver的具体实现类是PropertySourcesPropertyResolver,属性源的解决方案。该类是体系中唯一的完整实现类。它以PropertySources属性源集合(内部持有属性源列表List)为属性值的来源,按序遍历每个PropertySource,获取到一个非null的属性值则返回。

其中,PropertySourcesPropertyResolver中的List,表示不同属性源的来源,它的类关系图如下,表示针对不同数据源的存储。

image-20211216211933822

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构!
如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

Spring中的Environment外部化配置管理详解

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzgxgj.html