From 14b3994896fe0e0257541b1a30bcf072ae2a7014 Mon Sep 17 00:00:00 2001 From: huifer Date: Sat, 10 Oct 2020 15:09:39 +0800 Subject: [PATCH] doc: Spring-PropertySources.md --- docs/Spring/clazz/Spring-PropertySources.md | 509 ++++++++++++++++++++ images/spring/PropertySource.png | Bin 0 -> 44296 bytes 2 files changed, 509 insertions(+) create mode 100644 docs/Spring/clazz/Spring-PropertySources.md create mode 100644 images/spring/PropertySource.png diff --git a/docs/Spring/clazz/Spring-PropertySources.md b/docs/Spring/clazz/Spring-PropertySources.md new file mode 100644 index 0000000..76223ae --- /dev/null +++ b/docs/Spring/clazz/Spring-PropertySources.md @@ -0,0 +1,509 @@ +# Spring PropertySources + +- Author: [HuiFer](https://github.com/huifer) +- 源码阅读仓库: [SourceHot-spring](https://github.com/SourceHot/spring-framework-read) + + + + +## MutablePropertySources + +- 全路径: `org.springframework.core.env.MutablePropertySources` + +- `MutablePropertySources`类内部存储了`List>`对象,主要是针对`List>` 进行的操作.换句话说就是对 list 操作的实现 + +- 类注解如下 + + + +```java +public class MutablePropertySources implements PropertySources { + + private final List> propertySourceList = new CopyOnWriteArrayList<>(); + + + /** + * Create a new {@link MutablePropertySources} object. + * + * 构造方法 + */ + public MutablePropertySources() { + } + + /** + * Create a new {@code MutablePropertySources} from the given propertySources + * object, preserving the original order of contained {@code PropertySource} objects. + * 构造方法, 传递一个集合, 将集合中的数据放入 {@code propertySourceList}. + */ + public MutablePropertySources(PropertySources propertySources) { + this(); + // PropertySources 是一个迭代器接口的实现,通过循环取出信息放入到 propertySourceList 中 + for (PropertySource propertySource : propertySources) { + // 放入方法 + addLast(propertySource); + } + } + + + /** + * 获取迭代器对象 + */ + @Override + public Iterator> iterator() { + return this.propertySourceList.iterator(); + } + + /** + * 获取 Spliterator 对象 + */ + @Override + public Spliterator> spliterator() { + return Spliterators.spliterator(this.propertySourceList, 0); + } + + /** + * 获取流 + */ + @Override + public Stream> stream() { + return this.propertySourceList.stream(); + } + + /** + * 判断是否存在 name + * @param name the {@linkplain PropertySource#getName() name of the property source} to find + */ + @Override + public boolean contains(String name) { + return this.propertySourceList.contains(PropertySource.named(name)); + } + + /** + * 获取 PropertySource 信息 + * @param name the {@linkplain PropertySource#getName() name of the property source} to find + * @return + */ + @Override + @Nullable + public PropertySource get(String name) { + // 获取 name 所在的索引位置 + int index = this.propertySourceList.indexOf(PropertySource.named(name)); + // get方法获取结果 + return (index != -1 ? this.propertySourceList.get(index) : null); + } + + + /** + * 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. + * + * 在relativePropertySourceName的索引位置前添加数据 + */ + public void addBefore(String relativePropertySourceName, PropertySource propertySource) { + assertLegalRelativeAddition(relativePropertySourceName, propertySource); + removeIfPresent(propertySource); + int index = assertPresentAndGetIndex(relativePropertySourceName); + addAtIndex(index, propertySource); + } + + /** + * Add the given property source object with precedence immediately lower + * than the named relative property source. + * 在relativePropertySourceName的索引位置后添加数据 + */ + public void addAfter(String relativePropertySourceName, PropertySource propertySource) { + assertLegalRelativeAddition(relativePropertySourceName, propertySource); + // 删除存在的数据 + removeIfPresent(propertySource); + // 获取所有 + int index = assertPresentAndGetIndex(relativePropertySourceName); + // 在索引+1出添加数据 + addAtIndex(index + 1, propertySource); + } + + /** + * Return the precedence of the given property source, {@code -1} if not found. + * 获取索引位置 + */ + public int precedenceOf(PropertySource propertySource) { + return this.propertySourceList.indexOf(propertySource); + } + + /** + * Remove and return the property source with the given name, {@code null} if not found. + * 删除索引位置 + * @param name the name of the property source to find and remove + */ + @Nullable + public PropertySource remove(String name) { + // 获取索引 + int index = this.propertySourceList.indexOf(PropertySource.named(name)); + // 删除索引上的数据 + return (index != -1 ? this.propertySourceList.remove(index) : null); + } + + /** + * Replace the property source with the given name with the given property source object. + * 替换 name 的信息 + * @param name the name of the property source to find and replace + * @param propertySource the replacement property source + * @throws IllegalArgumentException if no property source with the given name is present + * @see #contains + */ + public void replace(String name, PropertySource propertySource) { + // 获取索引位置 + int index = assertPresentAndGetIndex(name); + // 设置具体所应位置的值 + this.propertySourceList.set(index, propertySource); + } + + /** + * Return the number of {@link PropertySource} objects contained. + * 数量 + */ + public int size() { + return this.propertySourceList.size(); + } + + @Override + public String toString() { + return this.propertySourceList.toString(); + } + + /** + * Ensure that the given property source is not being added relative to itself. + * 确保两个 PropertySource 的 name不相同 + */ + protected void assertLegalRelativeAddition(String relativePropertySourceName, PropertySource propertySource) { + // 获取 PropertySource 的名字 + String newPropertySourceName = propertySource.getName(); + // 历史名字和新的名字是否相同 + if (relativePropertySourceName.equals(newPropertySourceName)) { + throw new IllegalArgumentException( + "PropertySource named '" + newPropertySourceName + "' cannot be added relative to itself"); + } + } + + /** + * Remove the given property source if it is present. + * 删除已存在的数据 + */ + protected void removeIfPresent(PropertySource propertySource) { + this.propertySourceList.remove(propertySource); + } + + /** + * Add the given property source at a particular index in the list. + * 指定索引位置插入数据 + */ + private void addAtIndex(int index, PropertySource propertySource) { + removeIfPresent(propertySource); + this.propertySourceList.add(index, propertySource); + } + + /** + * Assert that the named property source is present and return its index. + * 获取 name 所在的索引位置 + * @param name {@linkplain PropertySource#getName() name of the property source} to find + * @throws IllegalArgumentException if the named property source is not present + */ + private int assertPresentAndGetIndex(String name) { + int index = this.propertySourceList.indexOf(PropertySource.named(name)); + if (index == -1) { + throw new IllegalArgumentException("PropertySource named '" + name + "' does not exist"); + } + return index; + } + +} +``` + + + + + +## PropertySources + +- 类路径: `org.springframework.core.env.PropertySources` + +- 详细说明如下 + +```java +public interface PropertySources extends Iterable> { + + /** + * Return a sequential {@link Stream} containing the property sources. + * 获取流 + * @since 5.1 + */ + default Stream> stream() { + return StreamSupport.stream(spliterator(), false); + } + + /** + * Return whether a property source with the given name is contained. + * 判断是否存在 name + * @param name the {@linkplain PropertySource#getName() name of the property source} to find + */ + boolean contains(String name); + + /** + * Return the property source with the given name, {@code null} if not found. + * 获取 PropertySource + * @param name the {@linkplain PropertySource#getName() name of the property source} to find + */ + @Nullable + PropertySource get(String name); + +} +``` + + + + + + + +## PropertySource + +- 类路径: `org.springframework.core.env.PropertySource` + +- 存有两个子类 + 1. StubPropertySource + 2. ComparisonPropertySource + 3. 调用`getSource`、`containsProperty`、`getProperty` 都会直接异常 + + + +```java +public abstract class PropertySource { + + protected final Log logger = LogFactory.getLog(getClass()); + + /** + * 属性名称 + */ + protected final String name; + + /** + * 值 + */ + protected final T source; + + + /** + * Create a new {@code PropertySource} with the given name and source object. + */ + public PropertySource(String name, T source) { + Assert.hasText(name, "Property source name must contain at least one character"); + Assert.notNull(source, "Property source must not be null"); + this.name = name; + this.source = source; + } + + /** + * Create a new {@code PropertySource} with the given name and with a new + * {@code Object} instance as the underlying source. + *

Often useful in testing scenarios when creating anonymous implementations + * that never query an actual source but rather return hard-coded values. + */ + @SuppressWarnings("unchecked") + public PropertySource(String name) { + this(name, (T) new Object()); + } + + /** + * Return a {@code PropertySource} implementation intended for collection comparison purposes only. + *

Primarily for internal use, but given a collection of {@code PropertySource} objects, may be + * used as follows: + *

+	 * {@code List> sources = new ArrayList>();
+	 * sources.add(new MapPropertySource("sourceA", mapA));
+	 * sources.add(new MapPropertySource("sourceB", mapB));
+	 * assert sources.contains(PropertySource.named("sourceA"));
+	 * assert sources.contains(PropertySource.named("sourceB"));
+	 * assert !sources.contains(PropertySource.named("sourceC"));
+	 * }
+ * The returned {@code PropertySource} will throw {@code UnsupportedOperationException} + * if any methods other than {@code equals(Object)}, {@code hashCode()}, and {@code toString()} + * are called. + * @param name the name of the comparison {@code PropertySource} to be created and returned. + */ + public static PropertySource named(String name) { + return new ComparisonPropertySource(name); + } + + /** + * Return the name of this {@code PropertySource}. + */ + public String getName() { + return this.name; + } + + /** + * Return the underlying source object for this {@code PropertySource}. + */ + public T getSource() { + return this.source; + } + + /** + * Return whether this {@code PropertySource} contains the given name. + *

This implementation simply checks for a {@code null} return value + * from {@link #getProperty(String)}. Subclasses may wish to implement + * a more efficient algorithm if possible. + * @param name the property name to find + */ + public boolean containsProperty(String name) { + // getProperty 抽象方法子类实现 + return (getProperty(name) != null); + } + + /** + * Return the value associated with the given name, + * or {@code null} if not found. + * // getProperty 抽象方法子类实现 + * @param name the property to find + * @see PropertyResolver#getRequiredProperty(String) + */ + @Nullable + public abstract Object getProperty(String name); + + /** + * This {@code PropertySource} object is equal to the given object if: + *

    + *
  • they are the same instance + *
  • the {@code name} properties for both objects are equal + *
+ *

No properties other than {@code name} are evaluated. + */ + @Override + public boolean equals(@Nullable Object other) { + return (this == other || (other instanceof PropertySource && + ObjectUtils.nullSafeEquals(this.name, ((PropertySource) other).name))); + } + + /** + * Return a hash code derived from the {@code name} property + * of this {@code PropertySource} object. + */ + @Override + public int hashCode() { + return ObjectUtils.nullSafeHashCode(this.name); + } + + /** + * Produce concise output (type and name) if the current log level does not include + * debug. If debug is enabled, produce verbose output including the hash code of the + * PropertySource instance and every name/value property pair. + *

This variable verbosity is useful as a property source such as system properties + * or environment variables may contain an arbitrary number of property pairs, + * potentially leading to difficult to read exception and log messages. + * @see Log#isDebugEnabled() + */ + @Override + public String toString() { + if (logger.isDebugEnabled()) { + return getClass().getSimpleName() + "@" + System.identityHashCode(this) + + " {name='" + this.name + "', properties=" + this.source + "}"; + } + else { + return getClass().getSimpleName() + " {name='" + this.name + "'}"; + } + } + + /** + * {@code PropertySource} to be used as a placeholder in cases where an actual + * property source cannot be eagerly initialized at application context + * creation time. For example, a {@code ServletContext}-based property source + * must wait until the {@code ServletContext} object is available to its enclosing + * {@code ApplicationContext}. In such cases, a stub should be used to hold the + * intended default position/order of the property source, then be replaced + * during context refresh. + * @see org.springframework.context.support.AbstractApplicationContext#initPropertySources() + * @see org.springframework.web.context.support.StandardServletEnvironment + * @see org.springframework.web.context.support.ServletContextPropertySource + */ + public static class StubPropertySource extends PropertySource { + + public StubPropertySource(String name) { + super(name, new Object()); + } + + /** + * Always returns {@code null}. + */ + @Override + @Nullable + public String getProperty(String name) { + return null; + } + } + + + /** + * A {@code PropertySource} implementation intended for collection comparison + * purposes. + * + * @see PropertySource#named(String) + */ + static class ComparisonPropertySource extends StubPropertySource { + + // 异常信息 + private static final String USAGE_ERROR = + "ComparisonPropertySource instances are for use with collection comparison only"; + + public ComparisonPropertySource(String name) { + super(name); + } + + @Override + public Object getSource() { + // 抛异常 + throw new UnsupportedOperationException(USAGE_ERROR); + } + + @Override + public boolean containsProperty(String name) { + // 抛异常 + throw new UnsupportedOperationException(USAGE_ERROR); + } + + @Override + @Nullable + public String getProperty(String name) { + // 抛异常 + throw new UnsupportedOperationException(USAGE_ERROR); + } + } + +} +``` + + + + + +类图 + +![PropertySource.png](/images/spring/PropertySource.png) \ No newline at end of file diff --git a/images/spring/PropertySource.png b/images/spring/PropertySource.png new file mode 100644 index 0000000000000000000000000000000000000000..b0a271a2f1b937bd134479f8a4cc9ba5ff13670f GIT binary patch literal 44296 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 CT2z|= literal 0 HcmV?d00001