Как интерфейс 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

Я знаю, что могу ждать бина в коде. Интересно зацепиться за саму весну.

Ответы на вопрос(5)

Ваш ответ на вопрос