整体结构图
本篇文章仅作简单了解,详细还等到Springboot系列里面详解
PropertyResolver
作用
用于针对任何基础源解析属性(Property)的接口
方法解析
// 查看规定指定的key是否有对应的value 对应key的值是null的话也算是不能解析
boolean containsProperty(String key);
// 返回指定key对应的value,如果没有则返回null
@Nullable
String getProperty(String key);
// 返回指定key对应的value,如果没有则返回defaultValue
String getProperty(String key, String defaultValue);
// 返回指定key对应的value,会解析成指定类型。如果没有对应值则返回null
@Nullable
<T> T getProperty(String key, Class<T> targetType);
// 返回指定key对应的value,会解析成指定类型。如果没有对应值则返回defaultValue
<T> T getProperty(String key, Class<T> targetType, T defaultValue);
// 转换指定key对应的value为指定类型。如果没有直接抛异常,所以不用担心返回值是null
String getRequiredProperty(String key) throws IllegalStateException;
// 返回指定key对应的value为指定类型。如果没有直接抛异常,所以不用担心返回值是null
<T> T getRequiredProperty(String key, Class<T> targetType) throws IllegalStateException;
// 解析${...}这种类型的占位符,把他们替换为使用getProperty方法返回的结果,解析不了并且没有默认值的占位符会被忽略
String resolvePlaceholders(String text);
// 解析${...}这种类型的占位符,把他们替换为使用getProperty方法返回的结果,解析不了并且没有默认值的占位符会抛异常
String resolveRequiredPlaceholders(String text) throws IllegalArgumentException;
ConfigurablePropertyResolver
作用
在PropertyResolver的基础之上增加了值转换功能。提供访问和自定义将属性值从一种类型转换为另一种类型时使用的ConversionService的工具。
方法解析
// 返回在解析属性时使用的ConfigurableConversionService。此方法的返回值可被用户定制化,例如可以移除或者添加Converter
ConfigurableConversionService getConversionService();
// 设置在涉及到属性转换操作时所使用到的ConfigurableConversionService。全部替换ConfigurableConversionService的操作不常用,
// 更常用的一种方法是使用getConversionService
void setConversionService(ConfigurableConversionService conversionService);
// 设置被此解析器替换的占位符必须以其开头的前缀/后缀 默认是${}
void setPlaceholderPrefix(String placeholderPrefix);
void setPlaceholderSuffix(String placeholderSuffix);
// 指定此解析器所替换的占位符与其关联的默认值之间的分隔字符,如果不应将此类特殊字符作为值分隔符处理,则为null。默认值的分隔符 默认为冒号:
void setValueSeparator(@Nullable String valueSeparator);
// 设置当遇到嵌套在给定属性值内的不可解析占位符时是否抛出异常。false表示严格解析,即抛出异常。true表示不可解析的嵌套占位符应该在其未解析的${…}形式
void setIgnoreUnresolvableNestedPlaceholders(boolean ignoreUnresolvableNestedPlaceholders);
// 指定必须出现的属性,以便由validateRequiredProperties()验证
void setRequiredProperties(String... requiredProperties);
// 验证setRequiredProperties指定的每个属性是否存在,并解析为一个非空值。
void validateRequiredProperties() throws MissingRequiredPropertiesException;
AbstractPropertyResolver
解析
实现类,基本实现了上面接口的所有方法,当然也提供一个抽象方法给子类去实现
PropertySourcesPropertyResolver
解析
Spring框架将某个属性源抽象成了类PropertySource,又将多个属性源PropertySource组合抽象为接口PropertySources。对某个PropertySource对象中属性的解析,抽象成了接口PropertyResolver,而类PropertySourcesPropertyResolver则是Spring用于解析一个PropertySources对象中属性的工具类。
Environment
JavaDoc
Environment是表示当前应用程序正在其中运行的环境的接口,它为应用环境制定了两个关键的方面:profile和properties,与属性访问有关的方法通过
PropertyResolver这个父接口公开(其中,PropertyResolver这个接口主要负责解析占位符对应的值);profile机制保证了仅在给定profile处于激活状态(active)
时才向容器注册的BeanDefinitiion的命名逻辑组;无论是用XML定义还是通过注解定义,都可以将Bean分配给指定的profile;与配置文件相关的Environment的作用是决定
当前哪些配置文件处于激活状态,以及默认情况下哪些配置文件应处于激活状态(即Environment配合profile可以完成指定模式的环境的组件装配,以及不同的配置属性注
入);Properties在几乎所有应用程序中都起着重要作用,并且可能源自多种来源:属性文件,JVM 系统属性,系统环境变量,JNDI,ServletContext参数,临时属性对象,
Map对象等;Environment与属性相关联的作用是为用户提供方便的接口,它可以用于配置属性源,并从Environment中解析属性;
Environment中存放了很多properties,properties的来源有很多种,而properties最终的作用都是提供属性配置,或为组件注入属性值;
在ApplicationContext中管理的Bean可以注册为EnvironmentAware或使用@Inject标注在Environment上,以便直接查询profile的状态或解析Properties;
但是,在大多数情况下,应用程序级 Bean不必直接与Environment交互,而是通过将${...} 属性值替换为属性占位符配置器进行属性注入
(例如PropertySourcesPlaceholderConfigurer),该属性本身是EnvironmentAware,当配置了<context:property-placeholder/>时,
默认情况下会使用Spring 3.1的规范注册;
Spring 3.1前占位符处理
组件:org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
Spring 3.1+占位符处理
组件:org.springframework.context.support.PropertySourcesPlaceholderConfigurer
Environment可以注入到组件中,用于获取当前环境激活的所有profile环境,但不推荐开发者直接使用它,而是通过占位符${...}注入属性的值;
Environment必须通过从所有AbstractApplicationContext子类的getEnvironment()方法返回的ConfigurableEnvironment接口完成环境对象的配置;
ConfigurableEnvironment具有可写属性的,可以修改Spring容器内部的属性值 / 数据;
方法解析
String[] getActiveProfiles();
String[] getDefaultProfiles();
@Deprecated
boolean acceptsProfiles(String... profiles);
boolean acceptsProfiles(Profiles profiles);
ConfigurableEnvironment
作用
这是一个配置接口,将由大多数(不是所有)环境类型的实现。提供用于设置活动配置文件和默认配置文件以及操作基础属性源的工具。允许客户端通过ConfigurablePropertyResolver 这个超级接口设置和验证所需属性、自定义转换服务等。
方法解析
//设置活动的配置文件
void setActiveProfiles(String... profiles);
// 增加活动的配置文件
void addActiveProfile(String profile);
// 设置默认的配置文件
void setDefaultProfiles(String... profiles);
// 获取PropertySource键值组合的集合
MutablePropertySources getPropertySources();
// 系统环境变量
Map<String, Object> getSystemEnvironment();
// 系统配置
Map<String, Object> getSystemProperties();
// 合并
void merge(ConfigurableEnvironment parent);
AbstractEnvironment
解析
如图,这是AbstractEnvironment的一些常量
其次还有一些比较重要的变量
我们可以看到customizePropertySources方法是一个模板方法,这个方法是交由子类去实现的,用于添加属性:
StandardEnvironment
解析
StandardEnvironment
通过customizePropertySources()
方法添加了systemEnvironment
和systemProperties
环境变量:
StandardServletEnvironment
StandardServletEnvironment
通过customizePropertySources()
方法添加了servletConfigInitParams
、servletContextInitParams
和jndiProperties
配置文件:
StandardServletEnvironment
StandardServletEnvironment
通过customizePropertySources()
方法添加了servletConfigInitParams
、servletContextInitParams
和jndiProperties
配置文件: