spring 源码研究—core包– PropertySource Environment

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

2019101710091\_1.png

系统环境的配置设计:

系统环境的配置一般字典的方式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。


来源:[]()

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » spring 源码研究—core包– PropertySource Environment

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏