Spring 启动时如何加载Environment和属性配置呢?
下文笔者讲述Spring容器启动时,何时加载env和属性信息的简介说明,如下所示
spring启动时,在构造函数中即可实现env和属性的加载 AbstractApplicationContext -> refresh () -> prepareRefresh () -> getEnvironment ().validateRequiredProperties ();
getEnvironment()函数内容
public ConfigurableEnvironment getEnvironment() { if (this.environment == null) { this.environment = createEnvironment(); } return this.environment; } protected ConfigurableEnvironment createEnvironment() { return new StandardEnvironment(); }
StandardEnvironment 继承自 AbstractEnvironment,看下 AbstractEnvironment 的构造方法
/********************* AbstractEnvironment ***************************/ private final MutablePropertySources propertySources = new MutablePropertySources(); public AbstractEnvironment() { customizePropertySources(this.propertySources); } // AbstractEnvironment自己没实现,由子类实现 protected void customizePropertySources(MutablePropertySources propertySources) { } public class MutablePropertySources implements PropertySources { private final list<PropertySource<?>> propertySourceList = new CopyOnWriteArrayList<>(); public MutablePropertySources() {} public MutablePropertySources(PropertySources propertySources) { this(); for (PropertySource<?> propertySource : propertySources) { addLast(propertySource); } } /** * Add the given property source object with highest precedence. */ public void addFirst(PropertySource<?> propertySource) { removeIfPresent(propertySource); this.propertySourceList.add(0, propertySource); } /** * Add the given property source object with lowest precedence. */ public void addLast(PropertySource<?> propertySource) { removeIfPresent(propertySource); this.propertySourceList.add(propertySource); } /** * Add the given property source object with precedence immediately higher * than the named relative property source. */ public void addBefore(String relativePropertySourceName, PropertySource<?> propertySource) { assertLegalRelativeAddition(relativePropertySourceName, propertySource); removeIfPresent(propertySource); int index = assertPresentAndGetIndex(relativePropertySourceName); addAtIndex(index, propertySource); } }
StandardEnvirontment中customizePropertySources函数实现
public class StandardEnvironment extends AbstractEnvironment { /** System environment property source name: {@value}. */ public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment"; /** JVM system properties property source name: {@value}. */ public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties"; /** * 实现了AbstractEnvironment的customizePropertySources方法,添加了系统环境和属性 * @see AbstractEnvironment#customizePropertySources(MutablePropertySources) * @see #getSystemProperties() * @see #getSystemEnvironment() */ @Override protected void customizePropertySources(MutablePropertySources propertySources) { // 注意这里添加是有顺序的, propertySources.addLast(new MapPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties())); propertySources.addLast(new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment())); } }
public class MapPropertySource extends EnumerablePropertySource<Map<String, Object>> { public MapPropertySource(String name, Map<String, Object> source) { super(name, source); } @Override @Nullable public Object getProperty(String name) { return this.source.get(name); } @Override public boolean containsProperty(String name) { return this.source.containsKey(name); } @Override public String[] getPropertyNames() { return StringUtils.toStringArray(this.source.keySet()); } } public class SystemEnvironmentPropertySource extends MapPropertySource { public SystemEnvironmentPropertySource(String name, Map<String, Object> source) { super(name, source); } @Override public boolean containsProperty(String name) { return (getProperty(name) != null); } @Override @Nullable public Object getProperty(String name) { String actualName = resolvePropertyName(name); return super.getProperty(actualName); } protected final String resolvePropertyName(String name) { Assert.notNull(name, "Property name must not be null"); String resolvedName = checkPropertyName(name); if (resolvedName != null) { return resolvedName; } String uppercasedName = name.toUpperCase(); if (!name.equals(uppercasedName)) { resolvedName = checkPropertyName(uppercasedName); if (resolvedName != null) { return resolvedName; } } return name; } @Nullable private String checkPropertyName(String name) { // Check name as-is if (containsKey(name)) { return name; } // Check name with just dots replaced String noDotName = name.replace('.', '_'); if (!name.equals(noDotName) && containsKey(noDotName)) { return noDotName; } // Check name with just hyphens replaced String noHyphenName = name.replace('-', '_'); if (!name.equals(noHyphenName) && containsKey(noHyphenName)) { return noHyphenName; } // Check name with dots and hyphens replaced String noDotNoHyphenName = noDotName.replace('-', '_'); if (!noDotName.equals(noDotNoHyphenName) && containsKey(noDotNoHyphenName)) { return noDotNoHyphenName; } // Give up return null; } private boolean containsKey(String name) { return (isSecurityManagerPresent() ? this.source.keySet().contains(name) : this.source.containsKey(name)); } protected boolean isSecurityManagerPresent() { return (System.getSecurityManager() != null); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。