From 4d21e6d1404ca249daf7a9ce09a5434d578b44c8 Mon Sep 17 00:00:00 2001 From: huifer Date: Sat, 10 Oct 2020 15:06:35 +0800 Subject: [PATCH] doc: PlaceholderResolver --- .../Spring-PlaceholderResolver.md | 26 ++++++ ...g-PropertyPlaceholderConfigurerResolver.md | 75 ++++++++++++++++++ ...pring-ServletContextPlaceholderResolver.md | 43 ++++++++++ ...pring-SystemPropertyPlaceholderResolver.md | 35 ++++++++ .../PropertyPlaceholderConfigurerResolver.png | Bin 0 -> 12108 bytes .../PropertyPlaceholderConfigurerResolver.png | Bin 0 -> 12108 bytes 6 files changed, 179 insertions(+) create mode 100644 docs/Spring/clazz/PlaceholderResolver/Spring-PlaceholderResolver.md create mode 100644 docs/Spring/clazz/PlaceholderResolver/Spring-PropertyPlaceholderConfigurerResolver.md create mode 100644 docs/Spring/clazz/PlaceholderResolver/Spring-ServletContextPlaceholderResolver.md create mode 100644 docs/Spring/clazz/PlaceholderResolver/Spring-SystemPropertyPlaceholderResolver.md create mode 100644 docs/Spring/clazz/PlaceholderResolver/images/PropertyPlaceholderConfigurerResolver.png create mode 100644 images/spring/PropertyPlaceholderConfigurerResolver.png diff --git a/docs/Spring/clazz/PlaceholderResolver/Spring-PlaceholderResolver.md b/docs/Spring/clazz/PlaceholderResolver/Spring-PlaceholderResolver.md new file mode 100644 index 0000000..e511150 --- /dev/null +++ b/docs/Spring/clazz/PlaceholderResolver/Spring-PlaceholderResolver.md @@ -0,0 +1,26 @@ +# Spring PlaceholderResolver +- 类全路径: `org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver` + +- 类作用将占位符中的内容替换成属性值. + - 假设现有属性表: user.dir = c:\home + 传入参数 user.dir 会获得 c:\home + +```java + + @FunctionalInterface + public interface PlaceholderResolver { + + /** + * Resolve the supplied placeholder name to the replacement value. + * @param placeholderName the name of the placeholder to resolve + * @return the replacement value, or {@code null} if no replacement is to be made + */ + @Nullable + String resolvePlaceholder(String placeholderName); + } + +``` + +- 类图如下 + +![PropertyPlaceholderConfigurerResolver](/images/spring/PropertyPlaceholderConfigurerResolver.png) diff --git a/docs/Spring/clazz/PlaceholderResolver/Spring-PropertyPlaceholderConfigurerResolver.md b/docs/Spring/clazz/PlaceholderResolver/Spring-PropertyPlaceholderConfigurerResolver.md new file mode 100644 index 0000000..cb50a27 --- /dev/null +++ b/docs/Spring/clazz/PlaceholderResolver/Spring-PropertyPlaceholderConfigurerResolver.md @@ -0,0 +1,75 @@ +# Spring PropertyPlaceholderConfigurerResolver + +- 类全路径: `org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.PropertyPlaceholderConfigurerResolver` + + +- 这个类是从 Properties 中获取属性 + +```java + private final class PropertyPlaceholderConfigurerResolver implements PlaceholderResolver { + + private final Properties props; + + private PropertyPlaceholderConfigurerResolver(Properties props) { + this.props = props; + } + + @Override + @Nullable + public String resolvePlaceholder(String placeholderName) { + return PropertyPlaceholderConfigurer.this.resolvePlaceholder(placeholderName, + this.props, systemPropertiesMode); + } + } + +``` + +- 详细方法如下 + +```java + + @Nullable + protected String resolvePlaceholder(String placeholder, Properties props, int systemPropertiesMode) { + String propVal = null; + if (systemPropertiesMode == SYSTEM_PROPERTIES_MODE_OVERRIDE) { + propVal = resolveSystemProperty(placeholder); + } + if (propVal == null) { + propVal = resolvePlaceholder(placeholder, props); + } + if (propVal == null && systemPropertiesMode == SYSTEM_PROPERTIES_MODE_FALLBACK) { + propVal = resolveSystemProperty(placeholder); + } + return propVal; + } + +``` + + +```java + @Nullable + protected String resolvePlaceholder(String placeholder, Properties props) { + return props.getProperty(placeholder); + } +``` + + +```java + @Nullable + protected String resolveSystemProperty(String key) { + try { + String value = System.getProperty(key); + if (value == null && this.searchSystemEnvironment) { + value = System.getenv(key); + } + return value; + } + catch (Throwable ex) { + if (logger.isDebugEnabled()) { + logger.debug("Could not access system property '" + key + "': " + ex); + } + return null; + } + } + +``` \ No newline at end of file diff --git a/docs/Spring/clazz/PlaceholderResolver/Spring-ServletContextPlaceholderResolver.md b/docs/Spring/clazz/PlaceholderResolver/Spring-ServletContextPlaceholderResolver.md new file mode 100644 index 0000000..f3ba8d3 --- /dev/null +++ b/docs/Spring/clazz/PlaceholderResolver/Spring-ServletContextPlaceholderResolver.md @@ -0,0 +1,43 @@ +# Spring ServletContextPlaceholderResolver + + +- 类全路径: `org.springframework.web.util.ServletContextPropertyUtils.ServletContextPlaceholderResolver` + +```java + private static class ServletContextPlaceholderResolver + implements PropertyPlaceholderHelper.PlaceholderResolver { + + private final String text; + + private final ServletContext servletContext; + + public ServletContextPlaceholderResolver(String text, ServletContext servletContext) { + this.text = text; + this.servletContext = servletContext; + } + + @Override + @Nullable + public String resolvePlaceholder(String placeholderName) { + try { + // servlet 上下文获取 + String propVal = this.servletContext.getInitParameter(placeholderName); + if (propVal == null) { + // Fall back to system properties. + propVal = System.getProperty(placeholderName); + if (propVal == null) { + // Fall back to searching the system environment. + propVal = System.getenv(placeholderName); + } + } + return propVal; + } + catch (Throwable ex) { + System.err.println("Could not resolve placeholder '" + placeholderName + "' in [" + + this.text + "] as ServletContext init-parameter or system property: " + ex); + return null; + } + } + } + +``` \ No newline at end of file diff --git a/docs/Spring/clazz/PlaceholderResolver/Spring-SystemPropertyPlaceholderResolver.md b/docs/Spring/clazz/PlaceholderResolver/Spring-SystemPropertyPlaceholderResolver.md new file mode 100644 index 0000000..d10ca38 --- /dev/null +++ b/docs/Spring/clazz/PlaceholderResolver/Spring-SystemPropertyPlaceholderResolver.md @@ -0,0 +1,35 @@ +# Spring SystemPropertyPlaceholderResolver + +- 类全路径: `org.springframework.util.SystemPropertyUtils.SystemPropertyPlaceholderResolver` + + +```java + private static class SystemPropertyPlaceholderResolver implements PropertyPlaceholderHelper.PlaceholderResolver { + + private final String text; + + public SystemPropertyPlaceholderResolver(String text) { + this.text = text; + } + + @Override + @Nullable + public String resolvePlaceholder(String placeholderName) { + try { + String propVal = System.getProperty(placeholderName); + if (propVal == null) { + // Fall back to searching the system environment. + // 获取系统属性 + propVal = System.getenv(placeholderName); + } + return propVal; + } + catch (Throwable ex) { + System.err.println("Could not resolve placeholder '" + placeholderName + "' in [" + + this.text + "] as system property: " + ex); + return null; + } + } + } + +``` \ No newline at end of file diff --git a/docs/Spring/clazz/PlaceholderResolver/images/PropertyPlaceholderConfigurerResolver.png b/docs/Spring/clazz/PlaceholderResolver/images/PropertyPlaceholderConfigurerResolver.png new file mode 100644 index 0000000000000000000000000000000000000000..16894fef758cb0ffb3c472d43cf3083818f55530 GIT binary patch literal 12108 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