在 Spring javadoc 中说,“请注意,Lifecycle 接口仅在顶级单例 bean 上受支持。” 这里网址
我LifecycleBeanTest.xml
对 bean 的描述如下:
<beans ...>
<bean id="lifecycle" class="tests.LifecycleBean"/>
</beans>
所以它看起来足够“topish”和“singletonish”。
这是什么意思?如何让 Spring 了解我的 bean 实现Lifecycle
并对其进行处理?
假设我的主要方法在 Spring 中看起来如下
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/tests/LifecycleBeanTest.xml").close();
}
因此,它实例化上下文,然后立即关闭它。
我可以在我的配置中创建一些 bean,它会延迟close()
执行,直到应用程序完成所有工作?那么主方法线程等待应用程序终止?
例如,下面的 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
我知道我可以在代码中等待 bean。与 Spring 本身挂钩很有趣。