private Map<String, ConfigProvider> instantiateConfigProviders(
            Map<String, String> indirectConfigs,
            Map<String, ?> providerConfigProperties,
            Predicate<String> classNameFilter
    ) {
        final String configProviders = indirectConfigs.get(CONFIG_PROVIDERS_CONFIG);

        if (configProviders == null || configProviders.isEmpty()) {
            return Collections.emptyMap();
        }

        Map<String, String> providerMap = new HashMap<>();

        for (String provider : configProviders.split(",")) {
            String providerClass = providerClassProperty(provider);
            if (indirectConfigs.containsKey(providerClass)) {
                String providerClassName = indirectConfigs.get(providerClass);
                if (classNameFilter.test(providerClassName)) {
                    providerMap.put(provider, providerClassName);
                } else {
                    throw new ConfigException(providerClassName + " is not allowed. Update System property '"
                            + AUTOMATIC_CONFIG_PROVIDERS_PROPERTY + "' to allow " + providerClassName);
                }
            }
        }
        // Instantiate Config Providers
        Map<String, ConfigProvider> configProviderInstances = new HashMap<>();
        for (Map.Entry<String, String> entry : providerMap.entrySet()) {
            try {
                String prefix = CONFIG_PROVIDERS_CONFIG + "." + entry.getKey() + CONFIG_PROVIDERS_PARAM;
                Map<String, ?> configProperties = configProviderProperties(prefix, providerConfigProperties);
                ConfigProvider provider = Utils.newInstance(entry.getValue(), ConfigProvider.class);
                provider.configure(configProperties);
                configProviderInstances.put(entry.getKey(), provider);
            } catch (ClassNotFoundException e) {
                log.error("Could not load config provider class " + entry.getValue(), e);
                throw new ConfigException(providerClassProperty(entry.getKey()), entry.getValue(), "Could not load config provider class or one of its dependencies");
            }
        }

        return configProviderInstances;
    }
Instantiates and configures the ConfigProviders. The config providers configs are defined as follows:
config.providers : A comma-separated list of names for providers.
config.providers.{name}.class : The Java class name for a provider.
config.providers.{name}.param.{param-name} : A parameter to be passed to the above Java class on initialization.
returns a map of config provider name and its instance.

@param indirectConfigs          The map of potential variable configs
@param providerConfigProperties The map of config provider configs
@param classNameFilter          Filter for config provider class names
@return map of config provider name and its instance.
clients/src/main/java/org/apache/kafka/common/config/AbstractConfig.java