Avoid HashSet/StringBuilder allocation for non-placeholder values

Closes gh-22870
master
Juergen Hoeller 5 years ago
parent ea4a174583
commit 9674ce4906
  1. 17
      spring-core/src/main/java/org/springframework/util/PropertyPlaceholderHelper.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2019 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -121,20 +121,26 @@ public class PropertyPlaceholderHelper {
*/ */
public String replacePlaceholders(String value, PlaceholderResolver placeholderResolver) { public String replacePlaceholders(String value, PlaceholderResolver placeholderResolver) {
Assert.notNull(value, "'value' must not be null"); Assert.notNull(value, "'value' must not be null");
return parseStringValue(value, placeholderResolver, new HashSet<>()); return parseStringValue(value, placeholderResolver, null);
} }
protected String parseStringValue( protected String parseStringValue(
String value, PlaceholderResolver placeholderResolver, Set<String> visitedPlaceholders) { String value, PlaceholderResolver placeholderResolver, @Nullable Set<String> visitedPlaceholders) {
StringBuilder result = new StringBuilder(value);
int startIndex = value.indexOf(this.placeholderPrefix); int startIndex = value.indexOf(this.placeholderPrefix);
if (startIndex == -1) {
return value;
}
StringBuilder result = new StringBuilder(value);
while (startIndex != -1) { while (startIndex != -1) {
int endIndex = findPlaceholderEndIndex(result, startIndex); int endIndex = findPlaceholderEndIndex(result, startIndex);
if (endIndex != -1) { if (endIndex != -1) {
String placeholder = result.substring(startIndex + this.placeholderPrefix.length(), endIndex); String placeholder = result.substring(startIndex + this.placeholderPrefix.length(), endIndex);
String originalPlaceholder = placeholder; String originalPlaceholder = placeholder;
if (visitedPlaceholders == null) {
visitedPlaceholders = new HashSet<>(4);
}
if (!visitedPlaceholders.add(originalPlaceholder)) { if (!visitedPlaceholders.add(originalPlaceholder)) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Circular placeholder reference '" + originalPlaceholder + "' in property definitions"); "Circular placeholder reference '" + originalPlaceholder + "' in property definitions");
@ -178,7 +184,6 @@ public class PropertyPlaceholderHelper {
startIndex = -1; startIndex = -1;
} }
} }
return result.toString(); return result.toString();
} }

Loading…
Cancel
Save