说明: 大多数环境类型实现的配置接口。提供用于设置活动和默认配置文件以及操作基础属性资源的工具。允许客户端通过ConfigurablePropertyResolver超级接口设置和验证所需的属性、定制转换服务等。
操作属性资源
属性源可以被删除、重新排序或替换;可以使用getPropertySources()返回的MutablePropertySources实例添加其他属性源。下面的例子是针对ConfigurableEnvironment的StandardEnvironment实现的,但通常适用于任何实现,尽管特定的默认属性源可能不同。
示例:添加一个具有最高搜索优先级的新属性源
ConfigurableEnvironment environment = new StandardEnvironment();
MutablePropertySources propertySources = environment.getPropertySources();
Map<String, String> myMap = new HashMap<>();
myMap.put("xyz", "myValue");
propertySources.addFirst(new MapPropertySource("MY_MAP", myMap));
示例:删除系统默认属性资源
MutablePropertySources propertySources = environment.getPropertySources();
propertySources.remove(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME);
示例:模拟系统环境以进行测试
MutablePropertySources propertySources = environment.getPropertySources();
MockPropertySource mockEnvVars = new MockPropertySource().withProperty("xyz", "myValue");
propertySources.replace(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, mockEnvVars);
当ApplicationContext正在使用环境时,在调用上下文的refresh()方法之前执行任何此类PropertySource操作是很重要的。这确保了所有属性源在容器引导过程中都是可用的,包括属性占位符配置器使用。
该接口继承了Environment和ConfigurablePropertyResolver接口,定义了以下方法:
// 指定此环境活动的配置文件集。配置文件在容器引导期间进行评估,以确定是否应该将bean定义注册到容器中。
任何现有的活动配置文件将被替换为给定的参数;调用时不带任何参数,以清除当前活动配置文件集。使用addActiveProfile可在保留现有集的同时添加配置文件。
void setActiveProfiles(String... profiles);
// 向当前活动配置文件集添加一个配置文件。
void addActiveProfile(String profile);
// 如果没有其他配置文件通过setActiveProfiles显式激活,则指定在默认情况下激活的配置文件集。
void setDefaultProfiles(String... profiles);
// 以可变的形式返回这个环境的PropertySources,允许操作PropertySource对象集,在解析这个环境对象的属性时应该搜索这些对象集。各种MutablePropertySources方法,如addFirst、addLast、addBefore和addAfter,允许对属性源排序进行细粒度控制。这很有用,例如,可以确保某些用户定义的属性源比默认属性源(如系统属性集或系统环境变量集)具有搜索优先级。
MutablePropertySources getPropertySources();
// 如果当前SecurityManager允许,则返回System.getProperties()的值,否则返回一个映射实现,该实现将尝试使用对System.getProperty(String)的调用访问各个键。
注意,大多数环境实现都将包含这个系统属性映射作为要搜索的默认PropertySource。因此,建议不要直接使用这种方法,除非有明确的意图绕过其他属性来源。
在返回的Map上调用Map.get(Object)永远不会抛出IllegalAccessException;在SecurityManager禁止访问属性的情况下,将返回null,并发出一个info级别的日志消息,指出异常。
Map<String, Object> getSystemProperties();
// 如果当前SecurityManager允许,则返回System.getenv()的值,否则返回一个映射实现,该实现将尝试使用对System.getenv(String)的调用访问各个键。
注意,大多数环境实现都将包含这个系统环境映射,作为要搜索的默认PropertySource。因此,建议不要直接使用这种方法,除非有明确的意图绕过其他属性来源。
在返回的Map上调用Map.get(Object)永远不会抛出IllegalAccessException;在SecurityManager禁止访问属性的情况下,将返回null,并发出一个info级别的日志消息,指出异常。
Map<String, Object> getSystemEnvironment();
// 将给定父环境的活动配置文件、默认配置文件和属性源附加到这个(子)环境的各自集合中。
对于父类和子类中存在的名称相同的PropertySource实例,子类实例将被保留,父类实例将被丢弃。这样做的效果是允许子程序重写属性源,以及避免通过常见的属性源类型(如系统环境和系统属性)进行冗余搜索。
活动和默认配置文件名称也被过滤重复,以避免混淆和冗余存储。
父环境在任何情况下都不会被修改。请注意,在merge调用之后发生的对父环境的任何更改都不会反映在子环境中。因此,在调用merge之前,应该注意配置父属性源和配置文件信息。
void merge(ConfigurableEnvironment parent);