|
|
|
@ -18,17 +18,25 @@ package org.springframework.context.support; |
|
|
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
import org.junit.jupiter.api.Test; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader; |
|
|
|
|
|
|
|
import org.springframework.context.ApplicationListener; |
|
|
|
|
|
|
|
import org.springframework.context.event.ContextRefreshedEvent; |
|
|
|
|
|
|
|
import org.springframework.core.io.ClassPathResource; |
|
|
|
|
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
import static org.assertj.core.api.Assertions.assertThat; |
|
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThatIllegalStateException; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* @author Mark Fisher |
|
|
|
* @author Mark Fisher |
|
|
|
* @author Chris Beams |
|
|
|
* @author Chris Beams |
|
|
|
|
|
|
|
* @author Juergen Hoeller |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
class ApplicationContextLifecycleTests { |
|
|
|
class ApplicationContextLifecycleTests { |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void beansStart() { |
|
|
|
void beansStart() { |
|
|
|
AbstractApplicationContext context = new ClassPathXmlApplicationContext("lifecycleTests.xml", getClass()); |
|
|
|
AbstractApplicationContext context = new ClassPathXmlApplicationContext("lifecycleTests.xml", getClass()); |
|
|
|
|
|
|
|
|
|
|
|
context.start(); |
|
|
|
context.start(); |
|
|
|
LifecycleTestBean bean1 = (LifecycleTestBean) context.getBean("bean1"); |
|
|
|
LifecycleTestBean bean1 = (LifecycleTestBean) context.getBean("bean1"); |
|
|
|
LifecycleTestBean bean2 = (LifecycleTestBean) context.getBean("bean2"); |
|
|
|
LifecycleTestBean bean2 = (LifecycleTestBean) context.getBean("bean2"); |
|
|
|
@ -39,12 +47,14 @@ class ApplicationContextLifecycleTests { |
|
|
|
assertThat(bean2.isRunning()).as(error).isTrue(); |
|
|
|
assertThat(bean2.isRunning()).as(error).isTrue(); |
|
|
|
assertThat(bean3.isRunning()).as(error).isTrue(); |
|
|
|
assertThat(bean3.isRunning()).as(error).isTrue(); |
|
|
|
assertThat(bean4.isRunning()).as(error).isTrue(); |
|
|
|
assertThat(bean4.isRunning()).as(error).isTrue(); |
|
|
|
|
|
|
|
|
|
|
|
context.close(); |
|
|
|
context.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void beansStop() { |
|
|
|
void beansStop() { |
|
|
|
AbstractApplicationContext context = new ClassPathXmlApplicationContext("lifecycleTests.xml", getClass()); |
|
|
|
AbstractApplicationContext context = new ClassPathXmlApplicationContext("lifecycleTests.xml", getClass()); |
|
|
|
|
|
|
|
|
|
|
|
context.start(); |
|
|
|
context.start(); |
|
|
|
LifecycleTestBean bean1 = (LifecycleTestBean) context.getBean("bean1"); |
|
|
|
LifecycleTestBean bean1 = (LifecycleTestBean) context.getBean("bean1"); |
|
|
|
LifecycleTestBean bean2 = (LifecycleTestBean) context.getBean("bean2"); |
|
|
|
LifecycleTestBean bean2 = (LifecycleTestBean) context.getBean("bean2"); |
|
|
|
@ -55,18 +65,21 @@ class ApplicationContextLifecycleTests { |
|
|
|
assertThat(bean2.isRunning()).as(startError).isTrue(); |
|
|
|
assertThat(bean2.isRunning()).as(startError).isTrue(); |
|
|
|
assertThat(bean3.isRunning()).as(startError).isTrue(); |
|
|
|
assertThat(bean3.isRunning()).as(startError).isTrue(); |
|
|
|
assertThat(bean4.isRunning()).as(startError).isTrue(); |
|
|
|
assertThat(bean4.isRunning()).as(startError).isTrue(); |
|
|
|
|
|
|
|
|
|
|
|
context.stop(); |
|
|
|
context.stop(); |
|
|
|
String stopError = "bean was not stopped"; |
|
|
|
String stopError = "bean was not stopped"; |
|
|
|
assertThat(bean1.isRunning()).as(stopError).isFalse(); |
|
|
|
assertThat(bean1.isRunning()).as(stopError).isFalse(); |
|
|
|
assertThat(bean2.isRunning()).as(stopError).isFalse(); |
|
|
|
assertThat(bean2.isRunning()).as(stopError).isFalse(); |
|
|
|
assertThat(bean3.isRunning()).as(stopError).isFalse(); |
|
|
|
assertThat(bean3.isRunning()).as(stopError).isFalse(); |
|
|
|
assertThat(bean4.isRunning()).as(stopError).isFalse(); |
|
|
|
assertThat(bean4.isRunning()).as(stopError).isFalse(); |
|
|
|
|
|
|
|
|
|
|
|
context.close(); |
|
|
|
context.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void startOrder() { |
|
|
|
void startOrder() { |
|
|
|
AbstractApplicationContext context = new ClassPathXmlApplicationContext("lifecycleTests.xml", getClass()); |
|
|
|
AbstractApplicationContext context = new ClassPathXmlApplicationContext("lifecycleTests.xml", getClass()); |
|
|
|
|
|
|
|
|
|
|
|
context.start(); |
|
|
|
context.start(); |
|
|
|
LifecycleTestBean bean1 = (LifecycleTestBean) context.getBean("bean1"); |
|
|
|
LifecycleTestBean bean1 = (LifecycleTestBean) context.getBean("bean1"); |
|
|
|
LifecycleTestBean bean2 = (LifecycleTestBean) context.getBean("bean2"); |
|
|
|
LifecycleTestBean bean2 = (LifecycleTestBean) context.getBean("bean2"); |
|
|
|
@ -81,18 +94,22 @@ class ApplicationContextLifecycleTests { |
|
|
|
assertThat(bean2.getStartOrder()).as(orderError).isGreaterThan(bean1.getStartOrder()); |
|
|
|
assertThat(bean2.getStartOrder()).as(orderError).isGreaterThan(bean1.getStartOrder()); |
|
|
|
assertThat(bean3.getStartOrder()).as(orderError).isGreaterThan(bean2.getStartOrder()); |
|
|
|
assertThat(bean3.getStartOrder()).as(orderError).isGreaterThan(bean2.getStartOrder()); |
|
|
|
assertThat(bean4.getStartOrder()).as(orderError).isGreaterThan(bean2.getStartOrder()); |
|
|
|
assertThat(bean4.getStartOrder()).as(orderError).isGreaterThan(bean2.getStartOrder()); |
|
|
|
|
|
|
|
|
|
|
|
context.close(); |
|
|
|
context.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
@Test |
|
|
|
void stopOrder() { |
|
|
|
void autoStartup() { |
|
|
|
AbstractApplicationContext context = new ClassPathXmlApplicationContext("lifecycleTests.xml", getClass()); |
|
|
|
GenericApplicationContext context = new GenericApplicationContext(); |
|
|
|
context.start(); |
|
|
|
new XmlBeanDefinitionReader(context).loadBeanDefinitions(new ClassPathResource("smartLifecycleTests.xml", getClass())); |
|
|
|
context.stop(); |
|
|
|
|
|
|
|
LifecycleTestBean bean1 = (LifecycleTestBean) context.getBean("bean1"); |
|
|
|
context.refresh(); |
|
|
|
LifecycleTestBean bean2 = (LifecycleTestBean) context.getBean("bean2"); |
|
|
|
LifecycleTestBean bean1 = (LifecycleTestBean) context.getBeanFactory().getBean("bean1"); |
|
|
|
LifecycleTestBean bean3 = (LifecycleTestBean) context.getBean("bean3"); |
|
|
|
LifecycleTestBean bean2 = (LifecycleTestBean) context.getBeanFactory().getBean("bean2"); |
|
|
|
LifecycleTestBean bean4 = (LifecycleTestBean) context.getBean("bean4"); |
|
|
|
LifecycleTestBean bean3 = (LifecycleTestBean) context.getBeanFactory().getBean("bean3"); |
|
|
|
|
|
|
|
LifecycleTestBean bean4 = (LifecycleTestBean) context.getBeanFactory().getBean("bean4"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context.close(); |
|
|
|
String notStoppedError = "bean was not stopped"; |
|
|
|
String notStoppedError = "bean was not stopped"; |
|
|
|
assertThat(bean1.getStopOrder()).as(notStoppedError).isGreaterThan(0); |
|
|
|
assertThat(bean1.getStopOrder()).as(notStoppedError).isGreaterThan(0); |
|
|
|
assertThat(bean2.getStopOrder()).as(notStoppedError).isGreaterThan(0); |
|
|
|
assertThat(bean2.getStopOrder()).as(notStoppedError).isGreaterThan(0); |
|
|
|
@ -102,7 +119,36 @@ class ApplicationContextLifecycleTests { |
|
|
|
assertThat(bean2.getStopOrder()).as(orderError).isLessThan(bean1.getStopOrder()); |
|
|
|
assertThat(bean2.getStopOrder()).as(orderError).isLessThan(bean1.getStopOrder()); |
|
|
|
assertThat(bean3.getStopOrder()).as(orderError).isLessThan(bean2.getStopOrder()); |
|
|
|
assertThat(bean3.getStopOrder()).as(orderError).isLessThan(bean2.getStopOrder()); |
|
|
|
assertThat(bean4.getStopOrder()).as(orderError).isLessThan(bean2.getStopOrder()); |
|
|
|
assertThat(bean4.getStopOrder()).as(orderError).isLessThan(bean2.getStopOrder()); |
|
|
|
context.close(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
|
|
|
void cancelledRefresh() { |
|
|
|
|
|
|
|
GenericApplicationContext context = new GenericApplicationContext(); |
|
|
|
|
|
|
|
new XmlBeanDefinitionReader(context).loadBeanDefinitions(new ClassPathResource("smartLifecycleTests.xml", getClass())); |
|
|
|
|
|
|
|
context.registerBean(FailingContextRefreshedListener.class); |
|
|
|
|
|
|
|
LifecycleTestBean bean1 = (LifecycleTestBean) context.getBeanFactory().getBean("bean1"); |
|
|
|
|
|
|
|
LifecycleTestBean bean2 = (LifecycleTestBean) context.getBeanFactory().getBean("bean2"); |
|
|
|
|
|
|
|
LifecycleTestBean bean3 = (LifecycleTestBean) context.getBeanFactory().getBean("bean3"); |
|
|
|
|
|
|
|
LifecycleTestBean bean4 = (LifecycleTestBean) context.getBeanFactory().getBean("bean4"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assertThatIllegalStateException().isThrownBy(context::refresh); |
|
|
|
|
|
|
|
String notStoppedError = "bean was not stopped"; |
|
|
|
|
|
|
|
assertThat(bean1.getStopOrder()).as(notStoppedError).isGreaterThan(0); |
|
|
|
|
|
|
|
assertThat(bean2.getStopOrder()).as(notStoppedError).isGreaterThan(0); |
|
|
|
|
|
|
|
assertThat(bean3.getStopOrder()).as(notStoppedError).isGreaterThan(0); |
|
|
|
|
|
|
|
assertThat(bean4.getStopOrder()).as(notStoppedError).isGreaterThan(0); |
|
|
|
|
|
|
|
String orderError = "dependent bean must stop before the bean it depends on"; |
|
|
|
|
|
|
|
assertThat(bean2.getStopOrder()).as(orderError).isLessThan(bean1.getStopOrder()); |
|
|
|
|
|
|
|
assertThat(bean3.getStopOrder()).as(orderError).isLessThan(bean2.getStopOrder()); |
|
|
|
|
|
|
|
assertThat(bean4.getStopOrder()).as(orderError).isLessThan(bean2.getStopOrder()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static class FailingContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void onApplicationEvent(ContextRefreshedEvent event) { |
|
|
|
|
|
|
|
throw new IllegalStateException(); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|