为什么Spring继续初始化上下文,即使bean无法实例化?

时间:2013-09-06 11:37:31

标签: java spring autowired spring-bean

我在初始上下文加载期间实例化bean时发现了一个奇怪的弹簧行为。我有一个装载大型ML模型的豆子。由于内存不足,bean无法实例化抛出java OutOfMemoryError java堆空间异常。 但这并不会阻止应用程序实例化,而是继续加载应用程序。

为什么会这样?这是预期的吗?

检查了春天AbstractAutowireCapableBeanFactory

try {
    // Mark this bean as currently in creation, even if just partially.
    beforeSingletonCreation(beanName);
    // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
    instance = resolveBeforeInstantiation(beanName, mbd);
    if (instance == null) {
        bw = createBeanInstance(beanName, mbd, null);
        instance = bw.getWrappedInstance();
    }
}
finally {
    // Finished partial creation of this bean.
    afterSingletonCreation(beanName);
}

使用评论// Finished partial creation of this bean.

静默消化异常

这是否会影响应用程序的稳定性?为什么设计如此?
或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

请注意,这里没有catch语句!此外,OutOfMemoryError不是Exception,因此它不会被标准普通catch (Exception e)捕获。

使用此finally子句,Throwable未被捕获。它必须在其他地方被捕获(消化)。

为什么Spring会继续工作?它基于Web服务器,而不是独立的专用应用程序,为什么它应该立即停止工作?并非所有异常都是关键的,即使错误有时(......很少)也会从中恢复。程序员有责任确保所有“他的”掷骰子得到妥善处理,而不是Spring's。