Spring没有中止bean初始化的引导错误启用组件扫描时出错?

Mar*_*cel 9 spring dependencies autowired

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

<bean id="flyway" class="xxx.FlywayTool" init-method="migrateOrFail"/>
Run Code Online (Sandbox Code Playgroud)

"flyway"bean用于初始化和迁移数据库.现在我有另一个bean定义应用程序应该使用的数据源:

<bean id="dataSource" class="..." depends-on="flyway">
Run Code Online (Sandbox Code Playgroud)

这个取决于飞路取得成功.

一切都很好.现在,当"flyway"bean引发异常时,spring的引导停止并且webapp启动完成 - 一切都很好.

现在我开始通过以下方式为某些组件启用自动装配:

<context:component-scan base-package="de.xxxxx.xxxxx" />
Run Code Online (Sandbox Code Playgroud)

在某些类中,我依赖于服务,这些服务在xml配置中也被定义为bean.他们依赖于上面提到的数据源.

现在的问题是:一旦我现在引导应用程序并且"flyway"抛出一个异常,弹出就会在下一节中吞下异常:

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;
}
Run Code Online (Sandbox Code Playgroud)

现在是春天尝试,对于其他所有dependend服务(取决于数据源,因此flyway)初始化所有bean,这反过来导致相同的过程一次又一次.

这个特殊的循环一直持续到春天结束,试图在第一个飞路错误之后实现每个可能的依赖,而不是中止.

这种奇怪的行为只有在我启用组件扫描时才会启动

<context:component-scan ....
Run Code Online (Sandbox Code Playgroud)

当此功能被禁用时,弹簧在第一个飞路错误发生后停止.它也最终出现在另一个类中:

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;
        }
Run Code Online (Sandbox Code Playgroud)

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

我们的春季版:3.0.6.RELEASE

这种行为也存在于其他类中抛出任何运行时执行(不仅仅是flyway)这是一个错误还是预期的行为?

任何帮助高度赞赏

烫发

Mar*_*szS 2

正如nico_ekito在评论中所说,放在<context:component-scan...XML 文件中的 beans 声明之后。

确认上班:

马塞尔:哇,这似乎有效。你认为我应该打开一个错误吗?或者这是有意的行为?