code: public String get(final String property) {
          Assert.hasText(property, "property should contain text.");
          final String secretName = getKeyvaultSecretName(property);
  
          // refresh periodically
          if (System.currentTimeMillis() - this.lastUpdateTime.get() > this.cacheRefreshIntervalInMs) {
              synchronized (this.refreshLock) {
                  if (System.currentTimeMillis() - this.lastUpdateTime.get() > this.cacheRefreshIntervalInMs) {
                      this.lastUpdateTime.set(System.currentTimeMillis());
                      fillSecretsHashMap();
                  }
              }
          }
  
          if (this.propertyNamesHashMap.containsKey(secretName)) {
              final SecretBundle secretBundle = this.keyVaultClient.getSecret(this.vaultUri, secretName);
              return secretBundle.value();
          } else {
              return null;
          }
      }
docs: For convention we need to support all relaxed binding format from spring, these may include:
  <table>
  <tr><td>Spring relaxed binding names</td></tr>
  <tr><td>acme.my-project.person.first-name</td></tr>
  <tr><td>acme.myProject.person.firstName</td></tr>
  <tr><td>acme.my_project.person.first_name</td></tr>
  <tr><td>ACME_MYPROJECT_PERSON_FIRSTNAME</td></tr>
  </table>
  But azure keyvault only allows ^[0-9a-zA-Z-]+$ and case insensitive, so there must be some conversion
  between spring names and azure keyvault names.
  For example, the 4 properties stated above should be convert to acme-myproject-person-firstname in keyvault.
  
  @param property of secret instance.
  @return the value of secret with given name or null.