先上类图:
均实现了BeanFactoryPostProcessor,作为容器的后置处理器---时机发生在配置文件加载完成之后,bean实例化之前。
而PriorityOrdered和PropertyResourceConfigurer组合实现order书序,描述了子类之间的加载顺序。
继承PropertiesLoaderSupport类,主要属性为:
locations--配置文件的位置。
properties--配置项的默认值,可以被locations中的配置项覆盖。
localOverride:是否由默认配置项覆盖locations中的配置项,默认为false
PropertyPlaceholderConfigurer
PropertyPlaceholderConfigurer是负责读取location属性配置的的properties属性文件里的属性值,并将这些属性值设置成Spring配置文件中的占位符里。
该类通过设置启用systemPropertiesMode和searchSystemEnvironment属性来控制占位符的值是否会到JVM系统属性(System.getProperty())和环境变量(System.getenv())中寻找。
SystemPropertiesModeName属性用来指定系统变量(System.getProperty)是否覆盖proprties文件。默认是在配置文件里找不到时使用。三个选项分别是:
SYSTEM_PROPERTIES_MODE_NEVER(不覆盖)
SYSTEM_PROPERTIES_MODE_FALLBACK(默认值,不存在时覆盖)
SYSTEM_PROPERTIES_MODE_OVERRIDE(覆盖)
searchSystemEnvironment属性的默认值为true,即允许环境变量覆盖properties中的值。
这里以spring-batch默认的配置文件作为示例:
<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
depends-on="environment">
<property name="location" value="classpath:batch-${ENVIRONMENT}.properties" />
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="order" value="1" />
</bean>
PropertyOverrideConfigurer
PropertyOverrideConfigurer的属性文件指定的信息可以直接覆盖Spring配置文件中原默认值(不管这个属性是否使用了占位符以及是否存在)。
ignoreInvalidKeys用来决定是否忽略不符合beanName.filedName这种规范的key,默认值是false,这个参数主要用来满足一个properties文件中可以放置任意类型的key。
spring-batch配置文件的示例:
<bean id="overrideProperties" class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"
depends-on="environment">
<property name="location" value="classpath:batch-${ENVIRONMENT}.properties" />
<!-- Allow system properties (-D) to override those from file -->
<property name="localOverride" value="true" />
<property name="properties">
<bean class="java.lang.System" factory-method="getProperties" />
</property>
<property name="ignoreInvalidKeys" value="true" />
<property name="order" value="2" />
</bean>