Spring javadoc には、「ライフサイクル インターフェイスは最上位のシングルトン Bean でのみサポートされていることに注意してください」と記載されています。こちらのURL
私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();
}
そのため、コンテキストをインスタンス化してからすぐに閉じます。
close()
アプリケーションがすべての機能を実行するまで実行を遅らせる Bean を構成内に作成できますか? そのメイン メソッド スレッドは、アプリケーションの終了を待機しますか?
たとえば、次の Bean は思ったように動作しません。どちらも呼び出されませ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
ビーン・イン・コードを待つことができることはわかっています。Spring 自体にフックするのは興味深いことです。