提交 56778110 编写于 作者: J Juergen Hoeller

added dedicated onClose notification to differentiate between manual stop and close-driven stop

上级 4e35c59a
...@@ -18,12 +18,21 @@ package org.springframework.context; ...@@ -18,12 +18,21 @@ package org.springframework.context;
/** /**
* Strategy interface for processing Lifecycle beans within the ApplicationContext. * Strategy interface for processing Lifecycle beans within the ApplicationContext.
* *
* @author Mark Fisher * @author Mark Fisher
* @author Juergen Hoeller
* @since 3.0 * @since 3.0
*/ */
public interface LifecycleProcessor extends Lifecycle { public interface LifecycleProcessor extends Lifecycle {
/**
* Notification of context refresh, e.g. for auto-starting components.
*/
void onRefresh(); void onRefresh();
/**
* Notification of context close phase, e.g. for auto-stopping components.
*/
void onClose();
} }
...@@ -22,7 +22,6 @@ import java.security.AccessControlException; ...@@ -22,7 +22,6 @@ import java.security.AccessControlException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
...@@ -50,7 +49,6 @@ import org.springframework.context.ApplicationEventPublisherAware; ...@@ -50,7 +49,6 @@ import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.HierarchicalMessageSource; import org.springframework.context.HierarchicalMessageSource;
import org.springframework.context.Lifecycle;
import org.springframework.context.LifecycleProcessor; import org.springframework.context.LifecycleProcessor;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.context.MessageSourceAware; import org.springframework.context.MessageSourceAware;
...@@ -955,7 +953,7 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader ...@@ -955,7 +953,7 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader
} }
// Stop all Lifecycle beans, to avoid delays during individual destruction. // Stop all Lifecycle beans, to avoid delays during individual destruction.
this.getLifecycleProcessor().stop(); getLifecycleProcessor().onClose();
// Destroy all cached singletons in the context's BeanFactory. // Destroy all cached singletons in the context's BeanFactory.
destroyBeans(); destroyBeans();
...@@ -1177,40 +1175,17 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader ...@@ -1177,40 +1175,17 @@ public abstract class AbstractApplicationContext extends DefaultResourceLoader
//--------------------------------------------------------------------- //---------------------------------------------------------------------
public void start() { public void start() {
this.getLifecycleProcessor().start(); getLifecycleProcessor().start();
publishEvent(new ContextStartedEvent(this)); publishEvent(new ContextStartedEvent(this));
} }
public void stop() { public void stop() {
this.getLifecycleProcessor().stop(); getLifecycleProcessor().stop();
publishEvent(new ContextStoppedEvent(this)); publishEvent(new ContextStoppedEvent(this));
} }
public boolean isRunning() { public boolean isRunning() {
for (Lifecycle lifecycle : getLifecycleBeans().values()) { return getLifecycleProcessor().isRunning();
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<String, Lifecycle> getLifecycleBeans() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
String[] beanNames = beanFactory.getSingletonNames();
Map<String, Lifecycle> beans = new LinkedHashMap<String, Lifecycle>();
for (String beanName : beanNames) {
Object bean = beanFactory.getSingleton(beanName);
if (bean instanceof Lifecycle) {
beans.put(beanName, (Lifecycle) bean);
}
}
return beans;
} }
......
...@@ -125,6 +125,10 @@ public class DefaultLifecycleProcessor implements LifecycleProcessor, BeanFactor ...@@ -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, * 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. * making sure that any beans that it depends on are started first.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册