Spring не прерывает начальную загрузку при инициализации bean-компонента Ошибка, когда включено сканирование компонентов? - PullRequest
9 голосов
/ 26 января 2012

У меня есть веб-приложение с файлом конфигурации Spring.У меня есть следующая запись:

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

Bean-компонент «flyway» используется для инициализации и миграции базы данных. Теперь у меня есть еще один bean-компонент, определяющий источник данных, который приложение должно использовать:

<bean id="dataSource" class="..." depends-on="flyway">

это зависит от пролетного пути, чтобы преуспеть.

Все работает нормально.Теперь, когда bean-компонент «flyway» выдает исключение, начальная загрузка пружины прекращается и запуск веб-приложения завершается - все хорошо.

Теперь я начинаю включать автопроводку для определенных компонентов с помощью:

<context:component-scan base-package="de.xxxxx.xxxxx" />

в некоторых классах я использую сервисы, которые также определены как bean-компоненты в конфигурации xml.и они, в свою очередь, зависят от источника данных, упомянутого выше.

теперь проблема: как только я запускаю приложение сейчас, и "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;
}

и теперь пытается весна для каждого другого зависимого сервиса (который зависитна источнике данных и, следовательно, на пути прохождения), инициализируйте все bean-компоненты, которые, в свою очередь, снова и снова приводят к одной и той же процедуре.

Этот исключительный цикл продолжается до тех пор, пока не закончится пружина, пытаясь создать все возможные зависимости вместо прерывания после первого прохождения.ошибка.

Это странное поведение начинается, только когда я включаю компонентное сканирование через

<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)это ошибка или ожидаемое поведение?

любая помощь высоко ценится

marcel

1 Ответ

1 голос
/ 06 января 2014

Поставьте <context:component-scan... после объявления вашего bean-компонента в XML-файле как nico_ekito , указанного в комментариях.

Подтверждено на работу:

Марсель: Вау, похоже, работает.вы считаете, я должен открыть ошибку?или это намеренное поведение?

...