介绍
Environment架构是spring 3.1版本引入的,它代表当前应用运行环境比如servlet,porlet
。主要处理两部分的内容 profiles和properties,properties将使用org.springframework.core.env.PropertyResolver解析。而Environment继承了此实现。
背景
一个profile是有名字的,在激活状态下它代表注册在容器中的一组bean definitions.一组bean可以通过xml和注解配置被归于到一个profile中,只要这个profile被激活了那这组bean则是可以被注册的。那Environment则担任了访问profile的角色。
Properties 几乎在所有的应用中都担任着重要角色。可能来源于properties file,JVM system properties, system environment variables, JNDI, servlet context parameters, ad-hoc Properties objects, Maps等等。那Environment则为用户提供了方便的接口以配置property Source和通过它们解析属性。
使用EnvironmentAware访问
可以在ApplicationContext 中为定义一个实现EnvironmentAware接口或@inject来了解这个Environment
在多数情况下,应用中的bean不需要与Enviroment直接交互,相反我们声明诸如PropertySourcesPlaceholderConfigurer的beanFactory处理器(本身实现了EnvironmentAware接口)和<context:property-placeholder/>来解析${}
如果想修改ActiveProfile和Properties则使用ConfigurableEnvironment
理解property sources
Environment架构提供了在一组有层次的property sources上进行迭代查询操作。便于理解,请看下面的例子
ApplicationContext ctx = new GenericApplicationContext();
Environment env = ctx.getEnvironment();
boolean containsFoo = env.containsProperty("foo");
System.out.println("Does my environment contain the 'foo' property? " + containsFoo);
以上片段中,我们请求spring容器在当前环境下是否存在'foo'属性。这样的请求会触发Environment 对象查询搜索一组PropertySource 对象,所谓PropertySource 代表简简单单的键值对。在默认DefaultEnvironment 下,spring配置了两种PropertySource ----一种代表JVM系统属性等价于System.getProperties()返回属性集;另一种代表系统环境变量等价于System.getenv()属性集。就是说如果一个'foo'JVM系统属性或一个'foo'环境变量出现在运行时,那env.containsProperty("foo")调用
将返回true.
而且搜素是具有先后概念的,默认情况下系统属性优先于环境变量。如果'foo'同时出现在JVM系统属性和环境变量中,则系统属性'foo'将胜出。
更重要的是搜素顺序是可以定制的,当想要自定义属性集插入到搜索序列中时可以实现PropertySource 接口并添加到Environment的一组PropertySources中。
ConfigurableApplicationContext ctx = new GenericApplicationContext();
MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
sources.addFirst(new MyPropertySource());
以上片段中MyPropertySource 被添加到搜索序列中且具有最高优先级。如果它包含'foo',则立即返回不用继续搜索其他的PropertySource 。
MutablePropertySources API提供了更精细化的方法管理一组PropertySource,将在最后介绍
注意:在单独的Application应用中,默认使用DefaultEnvironment;
在web应用中,则使用DefaultWebEnvironment,它在DefaultEnvironment基础上多了servletContext和servletConfig初始化参数
在porlet应用中,则使用DefaultPortletEnvironment,它在DefaultEnvironment基础上 多了porletContext和porletConfig初始化参数;
以上两种可以启用JndiPropertySource
使用property sources
理解property sources基本概念和与Environment的关系之后,如何将这些运用到开发中来,考虑几个场景
场景1:${placeholder}在<import/> 中
假如有几个特定于某些用户的spring配置文件,那么我们可以有条件的载入这些文件通过'customer' 属性值
<beans>
<import resource="com/bank/service/${customer}-config.xml"/>
</beans>
spring 3.1之前,import元素中占位符的值只能依赖于JVM system properties 和environment variables,现在就不是这样。Environment架构完全整合到容器中,通过它很容器解决属性占位符路由问题。就是说可以控制搜索过程,比如改变JVM system properties 和environment variables优先级、完全删除它们、添加自己的Property Source。
注意:<import/>元素的处理在BeanFactoryPostProcessors 调用之前,就是说PropertyPlaceholderConfigurer在这无效,因为environment对象和他的一组property source在refresh之前所以在<import/>中的占位符将被正确解析,没有任何生命周期问题。
场景2:${placeholder}在bean definition
多数开发人员熟悉使用PropertyPlaceholderConfigurer 或者 <context:property-placeholder/>替换bean配置中的 ${...},例如
context:property-placeholder location="com/bank/config/datasource.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClass" value="${database.driver}"/>
<property name="jdbcUrl" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</bean>
自spring 3.1以来<context:property-placeholder/>不再注册PropertyPlaceholderConfigurer,而是注册PropertySourcesPlaceholderConfigurer,这个组件仍然会查看datasource.properties以解析${database.*},如果没找到则在当前Environment 中查找。当然我们可以改变这种顺序。
注意:在某些情况下,<context:property-placeholder/>依旧会注册PropertyPlaceholderConfigurer,在spring-context schema 3.1版本中,system-properties-mode属性已经移除掉。这是因为这个属性在PropertySources-/Environment世界里不再起作用,但如果使用spring3.1开发,而schema则使用spring-context-3.0.xsd并且设置了system-properties-mode,那<context:property-placeholder>会注册PropertyPlaceholderConfigurer。
<context:property-placeholder system-properties-mode=""/>
在web应用中操纵 property sources
目前为止我们都是通过编程式的访问ApplicationContext操纵property sources
事实上很多spring应用时基于web的,使用ContextLoaderListener管理ApplicationContext。因此引入ApplicationContextInitializer 和它的伙伴servlet context 参数contextInitializerClasses(指定多个,以逗号分隔)
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>com.bank.MyInitializer</param-value>
</context-param>
public class MyInitializer implements ApplicationContextInitializer<ConfigurableWebApplicationContext> {
public void initialize(ConfigurableWebApplicationContext ctx) {
PropertySource ps = new MyPropertySource();
ctx.getEnvironment().getPropertySources().addFirst(ps);
// perform any other initialization of the context ...
}
实现和注册ApplicationContextInitializer时提供了一种方便的方式在容器refresh之前和ApplicationContext交互。正好在这操纵property sources,也可以设置bean.xml setConfigLocations
分享到:
相关推荐
插件开发环境(Plug-in Development Environment,简称PDE)是Eclipse平台提供的一个强大的工具集,用于支持插件(plug-in)的开发与维护。通过PDE,开发者可以创建、调试、测试以及发布各种类型的插件,包括但不...
本产品指南详细介绍了SymmWin软件在EMC Enginuity操作环境中的使用方法与特性。SymmWin是一款专门针对EMC存储系统的管理工具,旨在帮助用户更有效地管理和监控其EMC存储设备。 #### 版本信息 - **产品名称**:...
2. **JRE (Java Runtime Environment)**: Java运行环境,包含了运行Java程序所需要的环境,但不包含编译工具。 #### 三、JDK安装步骤 **第一步:下载与安装JDK** - 下载最新版本的JDK:可以从Oracle官网下载对应...
这个环境称为Java Runtime Environment(JRE),是Oracle公司提供的一个免费软件,用于支持和运行Java应用程序。64位版本的JRE是专为64位操作系统设计的,能够充分利用现代计算机硬件的内存资源,提高大型Java应用的...
Java运行环境,通常被称为Java Runtime Environment (JRE),是运行所有Java应用程序所必需的基础组件。它包含了Java虚拟机(JVM)、Java类库以及其他必要的组件,使得开发者编写的Java程序能够在各种操作系统上顺利...
标题“Eclipse属性页的支持”涉及的是Eclipse IDE中关于属性页(Property Pages)的开发与使用,这对于软件开发者来说是提升工作效率的重要工具。Eclipse属性页是用于展示和编辑项目或元素特定属性的一种界面,它...
`Environment`接口提供了获取属性的方法,可以在运行时动态获取属性值。`PropertySourcesPlaceholderConfigurer`是一个Bean后处理器,用于解析`@Value`注解中的占位符。 5. **Profile-Specific Properties** ...
你可以使用`environment`属性来设置或修改环境变量,如`shell.environment["PATH"] = "/usr/local/bin:$PATH"`。 为了更好地控制命令执行,ShellKit还提供了一些附加功能,比如设置工作目录、限制命令执行时间、...
Java运行环境主要由两部分组成:Java Development Kit (JDK) 和 Java Runtime Environment (JRE)。JDK 是Java开发工具包,包含了编译、调试、运行Java程序所需的所有工具和文档。而JRE则是Java程序运行时所需的环境...
Apache Flink是一个流行的开源流处理框架,用于实时和批处理数据处理。在Flink中,程序的核心组件包括Environment、Source、Transformations和Sink。我们来深入探讨这些概念以及如何使用它们。 **Environment**:它...
不同类型的打印机使用不同的控制序列,你需要翻一翻你的打印机手册。由于PowerBuilder使用数值0(即ASCII码为0的字符)结束每个字符串,因此,如果打印控制序列中包含了数值0,应用程序需要使用其它字符在参数string...
� 采用了对有限内存、电池和 CPU 优化过的虚拟机 Dalvik , Android 的运行速度比想象的要快很多。 � 运营商(中国移动等)的大力支持,产业链条的热捧。 � 良好的盈利模式( 3/7 开),产业链条的各方:运营商、...
### Microsoft Assembly MASM 6.1 Environment Tools #### 概述 Microsoft Assembly MASM (Microsoft Macro Assembler) 6.1 是一套专为 MS-DOS 和 Windows 操作系统设计的汇编语言开发环境。该版本提供了包括编程...
- **安装Java Runtime Environment (JRE)**:为Eclipse提供必要的Java运行环境。 - **安装Eclipse**:选择适用于嵌入式系统的Eclipse版本。 - **安装YAGARTO工具链**:包含编译器、链接器及其他开发工具。 - **...
- **Environment Abstraction**:Spring 3.1提供了一个环境抽象层,允许应用程序在不同的环境中使用不同的配置。 - **Property Source Abstraction**:Spring 3.1支持从多种来源加载属性,例如系统属性、环境变量等...
Visual Studio 2010 作为 Microsoft 推出的一款集成开发环境(Integrated Development Environment,简称 IDE),相较于之前的版本有了显著的进步,尤其是在 C++ 开发领域引入了许多新功能和改进。 #### 二、安装与...
- **Environment**:环境设置,包括路径变量等。 - **Compiler and Build Tools**:编译器和构建工具设置,可以配置编译器版本、优化选项等。 ### 总结 本文详细介绍了在VC6.0及其后续版本中如何进行环境变量...
- 变量名:`JRE_HOME`,变量值:JRE(Java Runtime Environment)的安装目录,通常位于`JAVA_HOME`的子目录下,例如`%JAVA_HOME%\jre`。 - 找到`Path`变量,将其值添加为 `%JAVA_HOME%\bin;%JRE_HOME%\bin`,这样...
- Integrated Development Environment (IDE),如Eclipse、IntelliJ IDEA等,是用于编写、调试和运行Java程序的集成环境。 - 配置Java开发环境通常包括安装JDK,设置JAVA_HOME环境变量,以及配置IDE。 3. **Java ...
MTK平台的设置与普通的Android设备有所不同,需要特定的编译环境来支持其硬件特性。 ### 安装步骤 文档是一个安装标准操作程序,通常会包含以下关键步骤: 1. 系统要求检查:确保操作系统是Ubuntu 14.04 64位版本...