spring 源码研究---core包-- PropertySource Environment

《spring 源码研究---core包-- PropertySource Environment》

系统环境的配置设计:

系统环境的配置一般字典的方式key代表一个环境变量名 value代表了环境变量值。常用来存储在如.property文件、Map中,或命令行参数中。
spring设计了用于存储属性资源的抽象类PropertySource他就相当于一个map把就这么理解把。

  PropertySource 抽象类主要是一对name/value值,它对euqals方法进行了重写 主要比较name属性是否相等 用于在集合中比较PropertySource对象,其中named()方法返回了一个值名称,value为空的PropertySource对象用于集合比较,它定了抽象方法public abstract Object getProperty(String name);,子类来实现得到拥有的value对象,这是模板方法的实现.

  EnumerablePropertySource继承PropertySource 它是一个抽象类,它定义了value是一个可数的对象,比如一个map集合,它定了抽象方法public abstract String[] getPropertyNames();子类来实现得到value对象的集合名称。
  EnumerablePropertySource子类分三种:
  1.组合PropertySource的CompositePropertySource
  2.常用map类型的MapPropertySource
  3.来自命令参数CommandLinePropertySource
  其中 MapPropertySource 下的子类 有PropertiesPropertySource和SystemEnvironmentPropertySource。
  PropertiesPropertySource用于来自Properties对象key/value 它有一个子类ResourcePropertySource。
  ResourcePropertySource可以把Resource资源文件转换为PropertySource资源,它可以使用不同的Resource实现类来创建。
  SystemEnvironmentPropertySource 它处理环境参数转化为PropertySource对象,比如System.getenv()中的参数。

  JndiPropertySource实现了PropertySource抽象类,jndi的lookfor来查找属性值
  以上PropertySources分别从比较PropertySource、Map、Properties、环境变量、资源文件、JDNI和合并多个PropertySource来实现。
  MutablePropertySources用来管理多个PropertySource,它相当于个list。

上面设置的PropertySources中存储的字典key value,可能是一些系统环境变量需要设置转换,或者value值有占位符需要解析后才能使用,PropertyResolver解析器就是为了解析PropertySource资源的。

 PropertyResolver接口定义的功能:解析PropertySource后取值、value值转换类型、value值占位符替换等。
 
 ConfigurablePropertyResolver配置接口继承了PropertyResolver接口,提供了访问和定制ConversionService服务,可以将属性值从一种类型转换为另一种类型。提供了可配置的占位符的设置。

  AbstractPropertyResolver抽象类实现ConfigurablePropertyResolver接口,尽可能多的抽象主要相同功能及配置,实现了接口方法整个骨架,最终点留给了子类实现。
  PropertySourcesPropertyResolver实现了抽象类AbstractPropertyResolver,使用接受一个PropertySources对象来作为属性源,PropertySources对象继承了Iterable接口,是迭代器模式,它持有PropertySource对象集合,循环集合对象进行查找、类型转换等.

环境配置文件
在不同的环境下,配置文件可能不同,比如:在开发阶段,配置文件中的数据库连接等信息和生产线上的配置文件是不同的。

  Environment接口继承PropertyResolver接口,它提供获得当前环境下的一个或多个配置名称。
提供一个默认环境下的属性配置。提供了一个判断是否接受环境值。
 
  ConfigurableEnvironment 继承Environment,ConfigurablePropertyResolver, 接口管理环境配置注册信息,你可以设定一个或多个要激活的配置,或设定一个多个默认配置,取得配置文件的所有信息。
 
  AbstractEnvironment抽象类实现ConfigurableEnvironment接口,它使用两个set集合来管理当前激活的和默认配置,来实现上面的接口定义,对于配置属性,则通过提供一个
钩子方法留给子类来配置文件MutablePropertySources,然后把子类加入的MutablePropertySources放入到父类的集合中管理,好莱坞法则:不要主动来找我,我会找你的。
  StandardEnvironment 就是其实现,它把系统的环境信息放入到MutablePropertySources中让父类管理。(Map) System.getenv()和(Map) System.getProperties() 得到返回值,转换为PropertySource,放入MutablePropertySources。

    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/zghwaicsdn/article/details/50875328
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞