В Spring javadoc сказано: "Обратите внимание, что интерфейс Lifecycle поддерживается только на одноэлементном уровне beans. Здесь URL
My LifecycleBeanTest.xml
описывает bean следующим образом:
<beans ...>
<bean id="lifecycle" class="tests.LifecycleBean"/>
</beans>
поэтому он выглядит "топическим" и "однотонным".
Что это значит? Как сделать Spring знать о моем bean реализации Lifecycle
и что-то сделать с ним?
Предположим, что мой основной метод выглядит следующим образом в Spring
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/tests/LifecycleBeanTest.xml").close();
}
поэтому он создает контекст и немедленно закрывает его.
Можно ли создать в моей конфигурации несколько bean, что задерживает выполнение close()
до тех пор, пока приложение не выполнит все действия? Так что основной поток метода ждет завершения приложения?
Например, следующий bean не работает так, как я думал. Не вызывается start()
not 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
Я знаю, что могу ждать bean в коде. Интересно подключиться к самому Spring.