您的位置:首页 > 编程语言 > Java开发

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

2016-03-13 08:42 417 查看


系统环境的配置设计:

系统环境的配置一般字典的方式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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: