¿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.