Example usage for org.springframework.beans.factory.config ConfigurableListableBeanFactory copyConfigurationFrom

List of usage examples for org.springframework.beans.factory.config ConfigurableListableBeanFactory copyConfigurationFrom

Introduction

In this page you can find the example usage for org.springframework.beans.factory.config ConfigurableListableBeanFactory copyConfigurationFrom.

Prototype

void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);

Source Link

Document

Copy all relevant configuration from the given other factory.

Usage

From source file:org.springframework.batch.core.configuration.support.AbstractApplicationContextFactory.java

/**
 * Extension point for special subclasses that want to do more complex things with the bean factory prior to
 * refresh. The default implementation copies all configuration from the parent according to the
 * {@link #setCopyConfiguration(boolean) flag} set.
 *
 * @param parent the parent bean factory for the new context (will never be null)
 * @param beanFactory the new bean factory before bean definitions are loaded
 *
 * @see AbstractApplicationContextFactory#setCopyConfiguration(boolean)
 * @see DefaultListableBeanFactory#copyConfigurationFrom(ConfigurableBeanFactory)
 *//*  ww w.  ja v  a 2s.  co m*/
protected void prepareBeanFactory(ConfigurableListableBeanFactory parent,
        ConfigurableListableBeanFactory beanFactory) {
    if (copyConfiguration && parent != null) {
        List<BeanPostProcessor> parentPostProcessors = new ArrayList<BeanPostProcessor>();
        List<BeanPostProcessor> childPostProcessors = new ArrayList<BeanPostProcessor>();

        childPostProcessors.addAll(beanFactory instanceof AbstractBeanFactory
                ? ((AbstractBeanFactory) beanFactory).getBeanPostProcessors()
                : new ArrayList<BeanPostProcessor>());
        parentPostProcessors.addAll(
                parent instanceof AbstractBeanFactory ? ((AbstractBeanFactory) parent).getBeanPostProcessors()
                        : new ArrayList<BeanPostProcessor>());

        try {
            Class<?> applicationContextAwareProcessorClass = ClassUtils.forName(
                    "org.springframework.context.support.ApplicationContextAwareProcessor",
                    parent.getBeanClassLoader());

            for (BeanPostProcessor beanPostProcessor : new ArrayList<BeanPostProcessor>(parentPostProcessors)) {
                if (applicationContextAwareProcessorClass.isAssignableFrom(beanPostProcessor.getClass())) {
                    logger.debug("Removing parent ApplicationContextAwareProcessor");
                    parentPostProcessors.remove(beanPostProcessor);
                }
            }
        } catch (ClassNotFoundException e) {
            throw new IllegalStateException(e);
        }

        List<BeanPostProcessor> aggregatedPostProcessors = new ArrayList<BeanPostProcessor>();
        aggregatedPostProcessors.addAll(childPostProcessors);
        aggregatedPostProcessors.addAll(parentPostProcessors);

        for (BeanPostProcessor beanPostProcessor : new ArrayList<BeanPostProcessor>(aggregatedPostProcessors)) {
            for (Class<?> cls : beanPostProcessorExcludeClasses) {
                if (cls.isAssignableFrom(beanPostProcessor.getClass())) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("Removing bean post processor: " + beanPostProcessor + " of type " + cls);
                    }
                    aggregatedPostProcessors.remove(beanPostProcessor);
                }
            }
        }

        beanFactory.copyConfigurationFrom(parent);

        List<BeanPostProcessor> beanPostProcessors = beanFactory instanceof AbstractBeanFactory
                ? ((AbstractBeanFactory) beanFactory).getBeanPostProcessors()
                : new ArrayList<BeanPostProcessor>();

        beanPostProcessors.clear();
        beanPostProcessors.addAll(aggregatedPostProcessors);
    }
}