Spring在3.1版本添加了org.springframework.core.env包,该包下面描述了Spring的环境架构体系,对Spring环境配置方面起到了重要作用。该包下面有PropertyResolver,Environment等接口描述Spring的环境信息。其中Environment接口作用可以让Spring根据不同的环境配置加载不同的配置信息。例如我们常用的测试环境和生产环境需要使用不同的数据源,通过配置环境信息即可达到无缝切换。PropertyResolver可以让我们加载属性信息。接下来就详细解说Spring的环境架构
1.环境架构整体说明
1.1.重要接口和类
1.1.1.PropertySource类
PropertySource是抽象类,该类是对(name/value)属性的抽象,其中value可以是任何类型属性,例如可以是java.util.Properties对象,java.util.Map对象,ServletContext和ServletConfig对象(可以获取初始化参数)。其方法public abstract Object getProperty(String name)
是抽象方法,由不同的子类去实现。Spring对常用的属性都定义了对应的实现类,不同的实现代表了不同的类型属性。其类图如下:
上图其中最重要的是EnumerablePropertySource类,是枚举行属性类,该类下面的子类就有我们常用属性文件对象,如PropertiesPropertySource
PropertySource和Spring中的Resource接口很像,Resource对所有的资源文件进行了抽象,并提供了各种资源的实现类,如ClassPathResource,FileSystemResource等,这里就不详细介绍,感兴趣的可以自己去探索。
1.1.2.PropertyResolver接口
PropertyResolver接口中定义了属性资源解析方法,可以理解为对PropertySource类的属性value解析。
1.1.3.Environment接口
Environment接口继承PropertyResolver接口,之所以要单独列出来是因为Spring对外暴露的是Environment而不是PropertyResolver接口。类图如下:
从图中可以看出两大实体组件,分别是环境(StandardEnvironment)和属性解决器(PropertySourcesPropertyResolver)。spring框架把两个组件的对外提供的功能性接口和自身的配置性接口进行了拆分,组件的配置API都集中在ConfigurableXXX接口中。
两个组件都只有唯一的标准实现类,即StandardEnvironment和PropertySourcesPropertyResolver。
两个组件之间的关系可以这样理解:
环境对象通过持有属性解决器对象的引用,从而实现组件复用。同时,环境对象所定义的接口继承自属性解决器接口,因此,环境对象也具有属性解决器的所有功能,而且在属性解决器的功能基础之上,又扩展出了环境的功能。细心的读者可能已经看出,这实际上是使用了装饰器模式,StandardEnvironment通过对PropertySourcesPropertyResolver的装饰,进行了功能增强。
我们可以将整个体系拆分成Environment和PropertyResolver两个体系,然后分别讲解
2.Environment使用
通过第一节的介绍说明了Spring整体环境架构,那么整体环境架构已经构建好了,我们该如何使用呢?
Spring提供了EnvironmentCapable接口,我们实现该接口可以使组件具有环境。接口定义如下:1
2
3
4
5public interface EnvironmentCapable {
Environment getEnvironment();
}
接口定义的唯一方法,就是获取与当前组件相关联的Environment环境对象。
该接口的实现类如图:
![EnvironmentCapable实现类][5]
可以看到ApplicationContext接口继承自这个接口,也就是说所有应用上下文都是具有环境的,当使用ApplicationContext实现类时调用getEnvironment就可以获取环境信息了。
参考资料
spring-core组件详解——环境体系
详解Spring中的Profile
想了解更多技术文章信息,请继续关注wiliam.s Blog,谢谢,欢迎来访!