【发布时间】:2012-02-19 18:20:24
【问题描述】:
我有一个带有 spring 配置文件的 web 应用程序。我有以下条目:
<bean id="flyway" class="xxx.FlywayTool" init-method="migrateOrFail"/>
“flyway”bean 用于初始化和迁移数据库。现在我有另一个 bean 定义了应用程序应该使用的数据源:
<bean id="dataSource" class="..." depends-on="flyway">
这个要靠flyway才能成功。
一切正常。现在,当“flyway”bean 抛出异常时,spring 的引导停止并且 webapp 启动完成 - 一切都很好。
现在我开始通过以下方式为某些组件启用自动装配:
<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 完成尝试实例化每个可能的依赖项,而不是在第一个 flyway 错误后中止。
这种奇怪的行为只有在我启用组件扫描时才会开始
<context:component-scan ....
如果禁用此功能,则在发生第一个飞行路径错误后弹簧停止。它也以另一个类结束:
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;
}
所以这也是我在另一种情况下所期望的行为。
我们的春季版本:3.0.6.RELEASE
这种行为也存在于其他类抛出任何运行时执行(不仅仅是flyway)这是一个错误还是预期的行为?
任何帮助都非常感谢
马塞尔
【问题讨论】:
-
您是否尝试在 XML 文件中的 beans 声明之后放置
<context:component-scan...? -
哇,这似乎行得通。你认为我应该打开一个错误?还是这是预期的行为?
-
这是一种预期行为,因为使用此功能,您可以使用 XML 配置覆盖注释驱动的配置。
-
好的,但是循环是否有意义,即使这总是会导致错误?
-
您是否尝试过更新到最新版本的 Spring?
标签: spring dependencies autowired