public void publish(boolean overrideExists) {
    synchronized (unresolvedRegistryMonitor) {
      invokeContainerPostProcessors(this);

      String[] factoryNames = getRegistry().getFactoryDefinitionNames();
      for (String factoryName : factoryNames) {
        FactoryDefinition definition = getRegistry().getFactoryDefinition(factoryName);
        FactoryDefinition declaredDefinition = definition;
        // is factory update factory
        if (definition.isFactoryUpdateFactory()) {
          factoryName = definition.getIdentifier();
          declaredDefinition = null;
          if (containsFactoryDefinition(factoryName)) {
            declaredDefinition = getFactoryDefinition(factoryName);
          } else if (getRegistry().containsFactoryDefinition(factoryName)) {
            declaredDefinition = getRegistry().getFactoryDefinition(factoryName);
          }
          if (declaredDefinition == null) {
            throw new FactoryDefinitionStoreException(
                definition.getResourceDescription(),
                factoryName,
                "Cannot update factory definition ["
                    + factoryName
                    + "] for factory '"
                    + definition
                    + "': There is no declared factory definition bound.");
          }
          updateFactoryDefinition(declaredDefinition, definition);
          declaredDefinition.init();
        }
        getRegistry().removeFactoryDefinition(definition.getName());
        getPublishedRegistry().registerFactoryDefinition(factoryName, declaredDefinition);
        GlobalFactory<?> factory = buildGlobalFactory(getContainer(), declaredDefinition);
        if (overrideExists || definition.isFactoryUpdateFactory()) {
          getContainer().replaceFactory(factoryName, factory);
        } else {
          getContainer().addFactory(factoryName, factory);
        }
      }
    }
  }