EnvironmentSpring核心框架中定义的一个接口,用来表示整个应用运行时的环境。

因为Spring中充斥了各种抽象的接口,所以简单地说Environment是一个接口可能并不会让你觉得Environment是做什么的,有多么重要。所以为了更形象地理解Environment,你也可以把Spring应用的运行时简单地想象成这样两个部分:一个是Spring应用本身,一个是Spring应用所处的环境,而Environment这个接口,就是对这个所处的环境的概念性建模。

这个接口对应用程序运行环境的两个关键方面进行了建模 :

  • profile
  • 一个profile是一组Bean定义(Bean definition)的逻辑分组(logical group)。
  • 这个分组,也就是这个profile,被赋予一个命名,就是这个profile的名字。
  • 只有当一个profile处于active状态时,它对应的逻辑上组织在一起的这些Bean定义才会被注册到容器中。
  • Bean添加到profile可以通过XML定义方式或者注解方式。
  • Environment对于profile机制所扮演的角色是用来指定哪些profile是当前活跃的/缺省活跃的。
  • property 属性
  • 一个应用的属性有很多来源: 属性文件(properties files),JVM系统属性,系统环境变量,JNDIservlet上下文参数,临时属性对象等。
  • Environment对于property所扮演的角色是提供给使用者一个方便的服务接口用于
  • 配置属性源
  • 从属性源中获取属性

容器(ApplicationContext)所管理的bean如果想直接使用Environment对象访问profile状态或者获取属性,可以有两种方式

  • 实现EnvironmentAware接口
  • @Inject 或者 @Autowired注入一个 Environment对象

绝大多数情况下,bean都不需要直接访问Environment对象,而是通过类似@Value注解的方式把属性值注入进来。

这个接口定义在包 org.springframework.core.env 中。下面是Spring围绕环境抽象Environment各个接口/类之间的继承关系:

spring 代码修改environment spring中environment_建模

接口/类

介绍

PropertyResolver

接口,抽象对属性源的访问,比如是否包含某个属性,读取属性,解析占位符,将读取到的属性转换成指定类型

Environment

接口,继承自PropertyResolver,对环境属性访问和default/active profile访问的抽象

因为继承自PropertyResolver,所以它自然具备PropertyResolver提供的所有能力,对环境属性的访问也正是通过PropertyResolver定义的这些能力

ConfigurablePropertyResolver

接口,为PropertyResolver接口抽象的属性源访问做了配置方面的增强。比如设置将属性值转换工具,指定占位符前缀后缀,遇到不可解析的嵌套的占位符怎么办等等

ConfigurableEnvironment

接口,在所继承的接口之上增加了设置defaut/active profile的能力,增加/删除环境对象中属性源的能力

ConfigurableWebEnvironment

接口,向接口ConfigurableEnvironment增强了根据Servlet上下文/配置初始化属性源的能力

AbstractEnvironment

Environment抽象基类,实现了ConfigurableEnvironment

StandardEnvironment

实现类,针对标准Spring应用(非Web应用)环境,

AbstractEnvironment基础上提供了属性源systemEnvironment(来自System.getenv())和systemProperties(来自System.getProperties())

StandardServletEnvironment

实现类,针对标准Spring Servlet Web应用的环境,

StandardEnvironment的基础上增加了servletContextInitParams/servletConfigInitParams/jndiProperties三个属性源