启用组件扫描时,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 声明之后放置 &lt;context:component-scan... 哇,这似乎行得通。你认为我应该打开一个错误?还是这是预期的行为? 这是一种预期行为,因为使用此功能,您可以使用 XML 配置覆盖注释驱动的配置。 好的,但是循环是否有意义,即使这总是会导致错误? 您是否尝试过更新到最新版本的 Spring? 【参考方案1】:

&lt;context:component-scan... 放在 XML 文件中的 bean 声明之后,如 cmets 中的 nico_ekito 所述。

确认工作:

Marcel:哇,这似乎行得通。你认为我应该打开一个错误?还是这是预期的行为?

【讨论】:

以上是关于启用组件扫描时,Spring 不会中止 bean 初始化时的引导错误?的主要内容,如果未能解决你的问题,请参考以下文章

Spring装配bean--01组件扫描和自动装配

Spring:扫描组件

Spring:扫描组件

Spring--通过注解来配置bean

5.spring:注解配置 Bean

Spring 使用组件扫描配置 bean - service.UserService 中的字段 userRepository 需要“repository”类型的 bean