diff --git a/org.springframework.context/src/main/java/org/springframework/context/LifecycleProcessor.java b/org.springframework.context/src/main/java/org/springframework/context/LifecycleProcessor.java index a903fee9028a027c4665d1a5e75e677cacd4d81f..127e71e94772b0c2ae828ac3279521f80883fafa 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/LifecycleProcessor.java +++ b/org.springframework.context/src/main/java/org/springframework/context/LifecycleProcessor.java @@ -18,12 +18,21 @@ package org.springframework.context; /** * Strategy interface for processing Lifecycle beans within the ApplicationContext. - * + * * @author Mark Fisher + * @author Juergen Hoeller * @since 3.0 */ public interface LifecycleProcessor extends Lifecycle { + /** + * Notification of context refresh, e.g. for auto-starting components. + */ void onRefresh(); + /** + * Notification of context close phase, e.g. for auto-stopping components. + */ + void onClose(); + } 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 82a412d77609cdf2af923bd2b58d5cbe583e7839..f86f192da21736866758287cbdcd5f627b951066 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 @@ -22,7 +22,6 @@ import java.security.AccessControlException; import java.util.ArrayList; import java.util.Collection; import java.util.Date; -import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; @@ -50,7 +49,6 @@ import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.context.ApplicationListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.HierarchicalMessageSource; -import org.springframework.context.Lifecycle; import org.springframework.context.LifecycleProcessor; import org.springframework.context.MessageSource; import org.springframework.context.MessageSourceAware; @@ -955,7 +953,7 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader } // Stop all Lifecycle beans, to avoid delays during individual destruction. - this.getLifecycleProcessor().stop(); + getLifecycleProcessor().onClose(); // Destroy all cached singletons in the context's BeanFactory. destroyBeans(); @@ -1177,40 +1175,17 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader //--------------------------------------------------------------------- public void start() { - this.getLifecycleProcessor().start(); + getLifecycleProcessor().start(); publishEvent(new ContextStartedEvent(this)); } public void stop() { - this.getLifecycleProcessor().stop(); + getLifecycleProcessor().stop(); publishEvent(new ContextStoppedEvent(this)); } public boolean isRunning() { - for (Lifecycle lifecycle : getLifecycleBeans().values()) { - if (!lifecycle.isRunning()) { - return false; - } - } - return true; - } - - /** - * Return a Map of all singleton beans that implement the - * Lifecycle interface in this context. - * @return Map of Lifecycle beans with bean name as key - */ - private Map getLifecycleBeans() { - ConfigurableListableBeanFactory beanFactory = getBeanFactory(); - String[] beanNames = beanFactory.getSingletonNames(); - Map beans = new LinkedHashMap(); - for (String beanName : beanNames) { - Object bean = beanFactory.getSingleton(beanName); - if (bean instanceof Lifecycle) { - beans.put(beanName, (Lifecycle) bean); - } - } - return beans; + return getLifecycleProcessor().isRunning(); } diff --git a/org.springframework.context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java b/org.springframework.context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java index 027536f8f90d915be29ac8bec35b41ee311f9acb..45d2f63f101b425004cbb0395b1511eaf208e84b 100644 --- a/org.springframework.context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java +++ b/org.springframework.context/src/main/java/org/springframework/context/support/DefaultLifecycleProcessor.java @@ -125,6 +125,10 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor } } + public void onClose() { + stop(); + } + /** * Start the specified bean as part of the given set of Lifecycle beans, * making sure that any beans that it depends on are started first.