¿Cómo funciona la interfaz de ciclo de vida en Spring? ¿Qué son los “frijoles singleton de nivel superior”?

Se dice en Spring javadoc, que "Tenga en cuenta que la interfaz del ciclo de vida solo se admite en los frijoles singleton de nivel superior". aquíURL

MiLifecycleBeanTest.xml describe el frijol de la siguiente manera:

<beans ...>
    <bean id="lifecycle" class="tests.LifecycleBean"/>
</beans>

por lo que se ve "topish" y "singletonish" suficiente.

Qué significa eso? Cómo hacer que Spring sepa sobre mi implementación de frijolLifecycle y hacer algo con eso?

Supongamos que mi principal método parece seguir en primavera

public static void main(String[] args) {
    new ClassPathXmlApplicationContext("/tests/LifecycleBeanTest.xml").close();
}

entonces, crea una instancia del contexto y luego lo cierra inmediatamente.

¿Puedo crear algún bean en mi configuración, lo que retrasaclose() ¿Ejecución hasta que la aplicación haga todo lo que funciona? ¿Así que el hilo principal del método espera la finalización de la aplicación?

Por ejemplo, el siguiente bean no funciona de la manera que pensé. Ningunostart() nostop() se llama.

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();
    }

}

ACTUALIZACIÓN 1

Sé que puedo esperar al frijol en código. Es interesante enganchar en la propia primavera.

Respuestas a la pregunta(5)

Su respuesta a la pregunta