生命周期界面在春季如何工作?什么是“顶级单例豆”?使用 TestContext 框架测试服务
在Spring javadoc中说,“请注意,生命周期接口仅在顶级单例bean上受支持。这里网址
My 对 Bean 的描述如下:LifecycleBeanTest.xml
<beans ...>
<bean id="lifecycle" class="tests.LifecycleBean"/>
</beans>
所以它看起来足够“顶级”和“单调”。
这是什么意思?如何让Spring知道我的豆子实现并用它做点什么?Lifecycle
假设我的主要方法在春季看起来紧随其后
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。与春天本身挂钩是很有趣的。