private synchronized void rebuildConfigInstances(final ProxyConfig newProxyConfig,
                                                     final boolean logChanges) {
        LOGGER.debug("Rebuilding object instance map");
        final Map<Class<? extends AbstractConfig>, AbstractConfig> newInstanceMap = new HashMap<>();

        final AtomicInteger changeCounter = new AtomicInteger();

        addConfigInstances(
                newProxyConfig,
                null,
                newInstanceMap,
                JsonUtil.getMapper(),
                ProxyConfig.ROOT_PROPERTY_PATH,
                changeCounter,
                logChanges);

        if (configInstanceMap == null || changeCounter.get() > 0) {
            LOGGER.debug("Swapping out configInstanceMap, changeCounter {}", changeCounter);
            // Now swap out the current map with the new one
            if (configInstanceMap == null) {
                configInstanceMap = new HashMap<>();
            }
            configInstanceMap = newInstanceMap;
        } else {
            LOGGER.debug("No change to the map");
        }

        if (logChanges) {
            if (changeCounter.get() > 0) {
                LOGGER.info("Completed update of application config with {} changed property values",
                        changeCounter.get());
            } else {
                LOGGER.info("No changes to config");
            }
        }

        LOGGER.debug("Completed rebuild of object instance map");
    }
This is sort of the equivalent to stroom's ConfigMapper class.
It holds the de-serialised config objects in a map that is then used to
provide them for guice injection.
stroom-proxy/stroom-proxy-app/src/main/java/stroom/proxy/app/guice/ProxyConfigProvider.java