Spring bean是否可以获得有关应用程序上下文初始化错误的通知?

时间:2016-10-05 17:14:06

标签: java spring

我的spring上下文中有一个单例bean(称之为“beanX'”),当启动时会旋转其他一些线程并在文件系统上创建一些状态。 所以我想以干净的方式停止它,以便在关闭上下文时释放资源。

我已使用@Bean(destroyMethod = "shutdown")对其进行了注释,并且按预期正常运行,没有任何问题。

进一步的信息是这个bean在上下文启动序列中很早就加载了(因为它有很多其他直接和间接使用它的bean),还有很多其他的bean在它之后加载。

现在解决这个问题:当我们进行开发时,其中一个bean无法启动并使spring上下文的启动失败 - 这是很常见的 - 但在这些情况下,beanX没有正确关闭。

这对于' productionCode'因为这通常意味着整个jvm停止然后资源被清理 - 但是当我们运行我们的1000+单元测试套件(并且一些测试有导致上下文崩溃的错误)时这变成了一个真正的问题因为测试JVM在测试之间没有停止,并且在每次失败的测试之后都会创建一个新的spring上下文 - 即使失败的测试在beanX启动之后没有正确清理但从未停止过!

今天,当我运行测试套件时,我的笔记本电脑创建了500万个文件句柄和13k个线程。

所以,我们目前唯一的方法就是让beanX成为一个公共静态字段(ClassX.beanX),它由spring上下文懒得初始化 - 然后在我们的测试代码中手动调用ClassX.beanX。 shutdown()如果发生任何上下文加载错误。

但我很好奇是否有更好/不同的春天'这样做的方法?

1 个答案:

答案 0 :(得分:0)

您可以在Spring中使用事件处理

  

ApplicationContext中的事件处理是通过   ApplicationEvent类和ApplicationListener接口。 如果是豆   实现 ApplicationListener 接口的部署到   上下文,每次将ApplicationEvent发布到   ApplicationContext,通知bean 。从本质上讲,这是   标准观察者设计模式