概述

Environment 这个接口代表应用运行时的环境。它代表了两方面、一个是 profile 一个是 properties。访问 property 的方法通过 Environment 继承的接口 PropertyResolver 暴露出去。

根据 profile 是否被激活、控制着哪些 bean 的信息会被注册到 Spring 的容器中。Environment 的作用就是提供获取当前哪些 profile 被激活、哪些 profile 是默认被激活的方法。

properties 的来源有以下的几个方面

  • properties 文件
  • JVM 系统属性
  • 系统环境变量
  • JNDI
  • Servlet 上下文变量

environment 为用户提供了简易的接口让用户去配置属性源(property source) 并且从属性源中解释属性出来。

PropertyResolver

除了常规的方法、有两个挺有一些的方法、用于解释 SPEL 表达式、当然只是 ${}的、如果想要解释 #{} 的、可以使用 StringValueResolver 解释。

PropertySource

PropertySource 非常类似于 Map,数据源可来自 Map、Properties、Resource 等。PropertySource 接口有两个特殊的子类:StubPropertySource 用于占位用,ComparisonPropertySource 用于集合排序,不允许获取属性值。

@Test
public void PropertySourceTest() throws IOException {PropertySource mapPropertySource = new MapPropertySource("map",Collections.singletonMap("key", "source1"));Assert.assertEquals("value1", mapPropertySource.getProperty("key"));ResourcePropertySource resourcePropertySource = new ResourcePropertySource("resource", "classpath:resources.properties");Assert.assertEquals("value2", resourcePropertySource.getProperty("key"));
}

CompositePropertySource

CompositePropertySource 提供了组合 PropertySource 的功能,查找顺序就是注册顺序。

@Test
public void CompositePropertySourceTest() throws IOException {PropertySource propertySource1 = new MapPropertySource("source1",Collections.singletonMap("key", "value1"));PropertySource propertySource2 = new MapPropertySource("source2",Collections.singletonMap("key", "value2"));CompositePropertySource compositePropertySource = new CompositePropertySource("composite");compositePropertySource.addPropertySource(propertySource1);compositePropertySource.addPropertySource(propertySource2);Assert.assertEquals("value1", compositePropertySource.getProperty("key"));
}

PropertySources

另外还有一个 PropertySources,从名字可以看出其包含多个 PropertySource。默认提供了一个 MutablePropertySources 实现,可以调用 addFirst 添加到列表的开头,addLast 添加到末尾,另外可以通过 addBefore(propertySourceName, propertySource) 或 addAfter(propertySourceName, propertySource) 添加到某个 propertySource 前面/后面;最后大家可以通过 iterator 迭代它,然后按照顺序获取属性。

注意:PropertySource 的顺序非常重要,因为 Spring 只要读到属性值就返回。

@Test
public void PropertySourcesTest() throws IOException {PropertySource propertySource1 = new MapPropertySource("source1",Collections.singletonMap("key", "value1"));PropertySource propertySource2 = new MapPropertySource("source2",Collections.singletonMap("key", "value2"));MutablePropertySources propertySources = new MutablePropertySources();propertySources.addFirst(propertySource1);propertySources.addLast(propertySource2);Assert.assertEquals("value1", propertySources.get("source1").getProperty("key"));Assert.assertEquals("value2", propertySources.get("source2").getProperty("key"));
}

Environment

其主要实现类是 AbstractEnvironment 中

StandardEnvironment 覆盖父类设置属性源的方法、向其增加系统属性和系统环境变量的属性源。

而StandardServletEnvironment 则是增加了 servlet相关的两个属性源、并且实现了初始化属性源的方法。将

StubPropertySource 替换为 servlet 相关的属性源。

大体上就是这样吧、一直不太理解 Environment 到底是何物、大概知道了现在。

https://www.cnblogs.com/binarylei/p/10280374.html

Environment 概述相关推荐

  1. 2020-09-15 JAVA面试题整理

    文章目录 一.Java基础系列面试题 二 Java 面试题(二) 四.Redis面试题 四.Redis面试题 七.Spring Boot 面试题 九.微服务 面试题 十一.RabbitMQ 面试题 十 ...

  2. 自动驾驶QNX,Linux,Autosar概述

    自动驾驶QNX,Linux,Autosar概述 QNX是一个分布式.嵌入式.可规模扩展的实时操作系统.遵循POSIX.1 (程序接口)和POSIX.2 (Shell和工具).部分遵循POSIX.1b( ...

  3. .Net Framework 3.0 概述

    Microsoft .NET Framework 3.0, the managed programming model for Microsoft® Windows®, includes the .N ...

  4. 从基于网络的安装服务器安装操作系统,PXE 概述 - Sun Fire X4800 服务器安装指南(适用于 Linux 操作系统)...

    PXE 概述 使用 Linux 预引导执行环境 (preboot execution environment, PXE) 可从网络接口而不是本地存储引导服务器.对于 OS 安装,从基于 PXE 的 O ...

  5. ServiceMesh架构的演变过程概述

    ServiceMesh概述 在软件体系结构中,服务网格是专用的基础结构层,用于通常使用Sidecar代理来促进微服务之间的服务之间通信. 具有这样一个专用的通信层可以提供许多好处,例如,提供对通信的可 ...

  6. Nginx源码分析:核心数据结构ngx_cycle_t与内存池概述

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> 核心数据结构与内存池概述 在Nginx中的核心数据结构就是ngx_cycle_t结构,在初始 ...

  7. 第1章 Java语言概述

    第1章 Java语言概述 声明 0. Java语言应用场景 1. 软件开发介绍 2. 计算机编程语言介绍 3. Java语言概述 4. Java程序运行机制及运行过程 5. Java的环境搭建  5. ...

  8. Java语言概述与简单程序

    Java语言概述 1. Java语言平台 1,J2EE(Java 2 Platform Enterprise Edition) 企业版 : 开发企业环境下的应用程序,主要针对web程序开发 2,J2S ...

  9. Java基础学习_01 概述及环境配置

    一.概述 1.Java语言平台版本 1.1J2SE(Java 2 Platform Standard Edition)标准版 为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可 ...

  10. jdbc驱动_JDBC概述和CRUD

    第八章 JDBC的简介 8.1 简介 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问 ...

最新文章

  1. C#写的windows应用程序打包
  2. 朱林北京大学计算机学院,北大、清华状元谈英语学习经验-20210411145045.docx-原创力文档...
  3. linux小小输入法 不能中文,在centos 下安装小小输入法存在的问题
  4. 使用 XHGui 对 PHP 应用进行性能诊断
  5. Android Q 不叫 Q,正式命名为 Android 10
  6. 指针和const限定
  7. jQuery Mobile入门必看
  8. Mac 10.12使用free命令(fish)
  9. 整理下常用到的css属性
  10. Simulink里的S函数介绍(Matlab-1)
  11. 用51单片机和esp8266实现通过手机app控制单片机小灯
  12. 对称密钥交换协议——实现在不安全的信道安全地传输密钥
  13. 扒一扒那些叫欧拉的定理们(四)——平面几何欧拉定理美学鉴赏
  14. IoT全品类全场景来了,但5G时代“大雁群飞”仍需紧盯“服务”
  15. java实现每天定时执行任务,Spring Task定时任务每天零点执行一次的操作
  16. 传奇服务器的角色文件在,传奇版本等一些软件放到服务器里的方法
  17. 广东省开展2022年省级制造业单项冠军企业(产品)培育遴选
  18. 自媒体写好文案的技巧,这5个网站请收藏好!你想要的都在!
  19. Android H5页面调起微信和支付宝付款
  20. python除法有余数时+1

热门文章

  1. Android 模块化总结
  2. 《哪吒》刷爆全网:不认命,就是我选择的命!做自己命运的主宰!
  3. [NDK]-搭建ndk-build环境
  4. AT32F435_437_USB_MSC_SDIO
  5. 2022网吧行业发展前景分析
  6. Tableau基础 | 维度、度量、蓝色、绿色
  7. html 免备案,域名没有备案使用cdn(免备案cdn推荐)
  8. 遭遇灰鸽子BackDoor.Gpigeon.ymg新变种
  9. 多台显示器图像拼接组成大屏幕是怎么实现的?
  10. 国内的微软更新服务器地址,windows update 服务器