class EtcdConfigEnvironmentProcessor implements EnvironmentPostProcessor, Ordered {

    public static final String ETCD_PROPERTY_SOURCE_NAME = "etcdPropertySource";

    @SneakyThrows
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {<FILL_FUNCTION_BODY>}

    /**
     * check environment property exist.
     * @param environment {@link ConfigurableEnvironment}
     * @return result
     */
    private boolean checkPropertyExist(ConfigurableEnvironment environment) {
        MutablePropertySources propertySources = environment.getPropertySources();
        return propertySources.stream().anyMatch(p -> ETCD_PROPERTY_SOURCE_NAME.equals(p.getName()));
    }

    /**
     * create environment property
     * @param environment {@link ConfigurableEnvironment}
     * @param properties config info
     */
    private void createPropertySource(ConfigurableEnvironment environment, Map<Object, Object> properties) {
        MutablePropertySources propertySources = environment.getPropertySources();
        OriginTrackedMapPropertySource source = new OriginTrackedMapPropertySource(ETCD_PROPERTY_SOURCE_NAME,
                properties);
        propertySources.addLast(source);
    }

    @Override
    public int getOrder() {
        return LOWEST_PRECEDENCE;
    }
}

        DtpProperties dtpProperties = DtpProperties.getInstance();
        BinderHelper.bindDtpProperties(environment, dtpProperties);
        DtpProperties.Etcd etcd = dtpProperties.getEtcd();
        val properties = EtcdUtil.getConfigMap(etcd, dtpProperties.getConfigType());
        if (!checkPropertyExist(environment)) {
            createPropertySource(environment, properties);
        }
    
<no_super_class>