启用组件扫描时,Spring 不会中止 bean 初始化时的引导错误?
Posted
技术标签:
【中文标题】启用组件扫描时,Spring 不会中止 bean 初始化时的引导错误?【英文标题】:Spring does not abort bootstrapping on bean initialization Error when component scanning is enabled? 【发布时间】: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?
【参考方案1】:
将 <context:component-scan...
放在 XML 文件中的 bean 声明之后,如 cmets 中的 nico_ekito 所述。
确认工作:
Marcel:哇,这似乎行得通。你认为我应该打开一个错误?还是这是预期的行为?
【讨论】:
以上是关于启用组件扫描时,Spring 不会中止 bean 初始化时的引导错误?的主要内容,如果未能解决你的问题,请参考以下文章
Spring 使用组件扫描配置 bean - service.UserService 中的字段 userRepository 需要“repository”类型的 bean