docs: protected String parseStringValue(String strVal, Properties props, Set visitedPlaceholders)
              throws BeanDefinitionStoreException {
  
          DynamicProperty dynamic = null;
  
          // replace reloading prefix and suffix by "normal" prefix and suffix.
          // remember all the "dynamic" placeholders encountered.
          StringBuffer buf = new StringBuffer(strVal);
          int startIndex = strVal.indexOf(this.placeholderPrefix);
          while (startIndex != -1) {
              int endIndex = buf.toString().indexOf(this.placeholderSuffix, startIndex + this.placeholderPrefix.length());
              if (endIndex != -1) {
                  if (currentBeanName != null && currentPropertyName != null) {
                      String placeholder = buf.substring(startIndex + this.placeholderPrefix.length(), endIndex);
                      placeholder = getPlaceholder(placeholder);
                      if (dynamic == null) {
                          dynamic = getDynamic(currentBeanName, currentPropertyName, strVal);
                      }
                      addDependency(dynamic, placeholder);
                  } else {
                      logger.debug("dynamic property outside bean property value - ignored: " + strVal);
                  }
                  startIndex = endIndex - this.placeholderPrefix.length() + this.placeholderPrefix.length() +
                          this.placeholderSuffix.length();
                  startIndex = strVal.indexOf(this.placeholderPrefix, startIndex);
              } else {
                  startIndex = -1;
              }
          }
          // then, business as usual. no recursive reloading placeholders please.
          return super.parseStringValue(buf.toString(), props, visitedPlaceholders);
      }