这是一个配置接口,将由大多数(不是所有)环境类型的实现。提供用于设置活动配置文件和默认配置文件以及操作基础属性源的工具。允许客户端通过ConfigurablePropertyResolver 这个超级接口设置和验证所需属性、自定义转换服务等。
1. 接口说明
接口定义如下:
public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {
void setActiveProfiles(String... profiles);
void addActiveProfile(String profile);
void setDefaultProfiles(String... profiles);
MutablePropertySources getPropertySources();
Map<String, Object> getSystemProperties();
Map<String, Object> getSystemEnvironment();
void merge(ConfigurableEnvironment parent);
}
接口类图如下:
image.png
操作属性源
可以删除、重新排序或替换属性源;可以使用从getPropertySources()返回的MutablePropertySources实例添加其他属性源。以下示例与ConfigurableEnvironment的StandardEnvironment实现相反,但通常适用于任何实现,尽管特定的默认属性源可能不同。
示例1: adding a new property source with highest search priority
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));
示例2: removing the default system properties property source
MutablePropertySources propertySources = environment.getPropertySources();
propertySources.remove(StandardEnvironment.SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME)
示例3: mocking the system environment for testing purposes
MutablePropertySources propertySources = environment.getPropertySources();
MockPropertySource mockEnvVars = new MockPropertySource().withProperty("xyz", "myValue");
propertySources.replace(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, mockEnvVars);
当ApplicationContext正在使用环境时,在调用上下文的refresh()方法之前执行任何此类PropertySource操作都很重要。这确保了所有属性源在容器引导过程中可用,包括属性占位符配置器使用。
2. 方法说明
2.1 setActiveProfiles方法
指定此环境的活动配置文件集。在容器引导过程中评估概要文件,以确定是否应该向容器注册bean定义。
任何现有的活动配置文件都将替换为给定的参数;使用零参数调用以清除当前活动配置文件集。使用addActiveProfile添加配置文件,同时保留现有集。
2.2 addActiveProfile方法
将配置文件添加到当前活动配置文件集。
2.3 setDefaultProfiles方法
如果没有其他配置文件通过setActiveProfiles显式激活,则指定默认情况下要激活的配置文件集。
2.4 getPropertySources方法
以可变形式返回此环境的PropertySources,允许在针对此环境对象解析属性时操作应搜索的PropertySource对象集。各种可变属性源方法(如addFirst、addLast、addBefore和addAfter)允许对属性源排序进行细粒度控制。例如,这有助于确保某些用户定义的特性源的搜索优先级高于默认特性源,例如系统特性集或系统环境变量集。
2.5 getSystemProperties方法
如果当前SecurityManager允许使用,返回System.getProperties()的值,否则返回一个映射实现,该实现将尝试通过调用System.getProperty(String)来访问各个键。
请注意,大多数环境实现都将此系统属性映射作为要搜索的默认属性源。因此,除非明确打算绕过其他属性源,否则建议不要直接使用此方法。
调用Map.get(Object)在返回的Map上永远不会抛出IllegalAccessException;在SecurityManager禁止访问属性的情况下,将返回null,并发出信息级日志消息,指出异常。
2.6 getSystemEnvironment方法
如果当前SecurityManager允许,返回 System.getenv()的值,否则返回一个映射实现,该实现将尝试使用对System.getenv(String)的调用来访问各个键。
注意,大多数环境实现将包括此系统环境映射作为要搜索的默认属性源。因此,除非明确打算绕过其他财产来源,否则建议不要直接使用此方法。
调用Map.get(Object) 在返回的地图上永远不会抛出IllegalAccessException;在SecurityManager禁止访问属性的情况下,将返回null,并发出信息级日志消息,指出异常。
2.7 merge方法
将给定父环境的活动配置文件、默认配置文件和属性源附加到此(子)环境各自的集合中。
对于父实例和子实例中存在的任何同名PropertySource实例,将保留子实例,并丢弃父实例。这可以允许子级重写属性源,并避免通过常见属性源类型(例如系统环境和系统属性)进行冗余搜索。
活动和默认配置文件名称也会被过滤掉,以避免混淆和冗余存储。
在任何情况下,父环境都保持不变。请注意,在调用合并后对父环境所做的任何更改都不会反映在子环境中。因此,在调用merge之前,应小心配置父属性源和配置文件信息。
网友评论