From 191bbd909bfce6662c8314fab1cffe8ecd3bbfa9 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 24 Nov 2009 23:46:44 +0000 Subject: [PATCH] fixed LifecycleProcessor lookup in a Spring Dynamic Modules context (SPR-6356); moved ConversionService lookup to prepareBeanFactory git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@2502 50f2f4bb-b051-0410-bef5-90022cba6387 --- .../support/AbstractApplicationContext.java | 104 +++++++++--------- 1 file changed, 49 insertions(+), 55 deletions(-) diff --git a/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java b/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java index f86f192da21..80143b8edd2 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java +++ b/org.springframework.context/src/main/java/org/springframework/context/support/AbstractApplicationContext.java @@ -297,19 +297,6 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader } } - /** - * Return the internal LifecycleProcessor used by the context. - * @return the internal LifecycleProcessor (never null) - * @throws IllegalStateException if the context has not been initialized yet - */ - private LifecycleProcessor getLifecycleProcessor() { - if (this.lifecycleProcessor == null) { - throw new IllegalStateException("LifecycleProcessor not initialized - " + - "call 'refresh' before invoking lifecycle methods via the context: " + this); - } - return this.lifecycleProcessor; - } - /** * Return the internal ApplicationEventMulticaster used by the context. * @return the internal ApplicationEventMulticaster (never null) @@ -323,6 +310,19 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader return this.applicationEventMulticaster; } + /** + * Return the internal LifecycleProcessor used by the context. + * @return the internal LifecycleProcessor (never null) + * @throws IllegalStateException if the context has not been initialized yet + */ + private LifecycleProcessor getLifecycleProcessor() { + if (this.lifecycleProcessor == null) { + throw new IllegalStateException("LifecycleProcessor not initialized - " + + "call 'refresh' before invoking lifecycle methods via the context: " + this); + } + return this.lifecycleProcessor; + } + /** * Return the ResourcePatternResolver to use for resolving location patterns * into Resource instances. Default is a @@ -400,15 +400,9 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); - // Initialize conversion service for this context. - initConversionService(); - // Initialize message source for this context. initMessageSource(); - // Initialize lifecycle processor for this context. - initLifecycleProcessor(); - // Initialize event multicaster for this context. initApplicationEventMulticaster(); @@ -494,6 +488,12 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); + // Initialize conversion service for this context. + if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME)) { + beanFactory.setConversionService( + beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)); + } + // Detect a LoadTimeWeaver and prepare for weaving, if found. if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); @@ -704,16 +704,6 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader } } - /** - * Initialize the BeanFactory's ConversionService. - */ - protected void initConversionService() { - ConfigurableListableBeanFactory beanFactory = getBeanFactory(); - if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME)) { - beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)); - } - } - /** * Initialize the MessageSource. * Use parent's if none defined in this context. @@ -748,6 +738,31 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader } } + /** + * Initialize the ApplicationEventMulticaster. + * Uses SimpleApplicationEventMulticaster if none defined in the context. + * @see org.springframework.context.event.SimpleApplicationEventMulticaster + */ + protected void initApplicationEventMulticaster() { + ConfigurableListableBeanFactory beanFactory = getBeanFactory(); + if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) { + this.applicationEventMulticaster = + beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); + if (logger.isDebugEnabled()) { + logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]"); + } + } + else { + this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); + beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); + if (logger.isDebugEnabled()) { + logger.debug("Unable to locate ApplicationEventMulticaster with name '" + + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + + "': using default [" + this.applicationEventMulticaster + "]"); + } + } + } + /** * Initialize the LifecycleProcessor. * Uses DefaultLifecycleProcessor if none defined in the context. @@ -775,31 +790,6 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader } } - /** - * Initialize the ApplicationEventMulticaster. - * Uses SimpleApplicationEventMulticaster if none defined in the context. - * @see org.springframework.context.event.SimpleApplicationEventMulticaster - */ - protected void initApplicationEventMulticaster() { - ConfigurableListableBeanFactory beanFactory = getBeanFactory(); - if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) { - this.applicationEventMulticaster = - beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); - if (logger.isDebugEnabled()) { - logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]"); - } - } - else { - this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); - beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); - if (logger.isDebugEnabled()) { - logger.debug("Unable to locate ApplicationEventMulticaster with name '" + - APPLICATION_EVENT_MULTICASTER_BEAN_NAME + - "': using default [" + this.applicationEventMulticaster + "]"); - } - } - } - /** * Template method which can be overridden to add context-specific refresh work. * Called on initialization of special beans, before instantiation of singletons. @@ -858,7 +848,11 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader * {@link org.springframework.context.event.ContextRefreshedEvent}. */ protected void finishRefresh() { - this.lifecycleProcessor.onRefresh(); + // Initialize lifecycle processor for this context. + initLifecycleProcessor(); + + // Propagate refresh to lifecycle processor first. + getLifecycleProcessor().onRefresh(); // Publish the final event. publishEvent(new ContextRefreshedEvent(this));