gpt4 book ai didi

Spring不会在bean初始化时中止 Bootstrap 启动组件扫描时出错?

转载 作者:行者123 更新时间:2023-12-04 04:39:02 27 4
gpt4 key购买 nike

我有一个带有Spring配置文件的Web应用程序。我有以下条目:

<bean id="flyway" class="xxx.FlywayTool" init-method="migrateOrFail"/>

“flyway” bean用于初始化和迁移数据库。现在,我还有另一个bean定义了应用程序应使用的数据源:
<bean id="dataSource" class="..." depends-on="flyway">

这取决于成功的飞路。

一切正常。现在,当“flyway” bean抛出异常时,spring的 bootstrap 停止并且Webapp启动完成-一切都很好。

现在,我开始通过以下方式为某些组件启用 Autowiring :
<context:component-scan base-package="de.xxxxx.xxxxx" />

在某些类中,我依赖于在xml配置中也定义为bean的服务。而我转而依赖于上面提到的数据源。

现在的问题是:一旦我立即引导应用程序并且“flyway”抛出异常,则在以下部分中,spring会吞下该异常:

org.springframework.beans.factory.support.AbstractBeanFactory.getTypeForFactoryBean(String,RootBeanDefinition)
catch (BeanCreationException ex) {
// Can only happen when getting a FactoryBean.
if (logger.isDebugEnabled()) {
logger.debug("Ignoring bean creation exception on FactoryBean type check: " + ex);
}
onSuppressedException(ex);
return null;
}

现在,spring尝试对所有其他依赖服务(依赖于数据源,因此依赖于flyway)初始化所有bean,这反过来又一次又一次地导致相同的过程。

这种异常的循环一直持续到 Spring 结束,试图证实所有可能的依赖关系,而不是在出现第一个飞路错误后中止运行。

仅当我通过以下方式启用组件扫描时,这种奇怪的行为才会开始
<context:component-scan ....

如果禁用此功能,则在第一次飞行错误发生后, Spring 就会停止。它也以另一个类结尾:

org.springframework.context.support.AbstractApplicationContext.refresh()
        catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
destroyBeans();

// Reset 'active' flag.
cancelRefresh(ex);

// Propagate exception to caller.
throw ex;
}

所以这也是我在其他情况下期望的行为。

我们的 Spring 版本: 3.0.6.RELEASE

其他类抛出任何运行时执行情况(不仅仅是flyway)也存在这种现象,这是错误还是预期的行为?

任何帮助,高度赞赏

马塞尔

最佳答案

nico_ekito在注释中所述,在XML文件中的bean声明之后放置<context:component-scan...

确认可以工作:

Marcel: wow, that seems to work. you reckon i should open a bug? or is this intended behaviour?

关于Spring不会在bean初始化时中止 Bootstrap 启动组件扫描时出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9021807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com