Как интерфейс Lifecycle работает в Spring? Что такое «синглтон-бобы верхнего уровня»?
В Spring javadoc сказано, что «обратите внимание, что интерфейс жизненного цикла поддерживается только на одноэлементных компонентах верхнего уровня». ВотURL
мойLifecycleBeanTest.xml
описывает бин следующим образом:
<beans ...>
<bean id="lifecycle" class="tests.LifecycleBean"/>
</beans>
таким образом, это выглядит "topish" и "singletonish" достаточно.
Что это значит? Как сообщить Spring о реализации моего компонентаLifecycle
и сделать что-нибудь с этим?
Предположим, мой основной метод выглядит следующим образом весной
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/tests/LifecycleBeanTest.xml").close();
}
Таким образом, он создает экземпляр контекста, а затем немедленно закрывает его.
Могу ли я создать бин в моей конфигурации, что задерживаетclose()
выполнение, пока приложение не сделает все это работает? Так что основной метод потока ожидает завершения приложения?
Например, следующий компонент не работает так, как я думал. ниstart()
неstop()
называется.
package tests;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.Lifecycle;
public class LifecycleBean implements Lifecycle {
private static final Logger log = LoggerFactory.getLogger(LifecycleBean.class);
private final Thread thread = new Thread("Lifecycle") {
{
setDaemon(false);
setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
log.error("Abnormal thread termination", e);
}
});
}
public void run() {
for(int i=0; i<10 && !isInterrupted(); ++i) {
log.info("Hearbeat {}", i);
try {
sleep(1000);
} catch (InterruptedException e) {
return;
}
}
};
};
@Override
public void start() {
log.info("Starting bean");
thread.start();
}
@Override
public void stop() {
log.info("Stopping bean");
thread.interrupt();
try {
thread.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
@Override
public boolean isRunning() {
return thread.isAlive();
}
}
ОБНОВЛЕНИЕ 1
Я знаю, что могу ждать бина в коде. Интересно зацепиться за саму весну.