2016-09-15 4 views
1

У меня возникли проблемы с попыткой настроить мою автоконфигурацию. У меня есть два баночки, каждый из которых имеет файл spring.factories, где эти два включены для EnableAutoConfigurationProperties.Конфигурация конфигурации конфигурации Spring Boot от внешней зависимости

Эта конфигурация в моем-пакет-mock.jar, это зависит от моего-пакета-real.jar ниже:

package org.packages.package.packageA; 
@Configuration 
@AutoConfigureBefore(AutoConfigurationB.class) 
public class AutoConfigurationA { 

    @Bean 
    public MyService mockService() { 
     return new MyMockService(); 
    } 
} 

Эта конфигурация находится в моем-пакет-real.jar:

package org.packages.package.packageB; 
@Configuration 
@ConditionalOnMissingBean(MyService.class) 
public class AutoConfigurationB { 

    @Bean 
    public MyService realService() { 
     return new MyRealService(); 
    } 
} 

Теперь идея состоит в том, что если включен my-package-mock.jar, то AutoConfigurationB не будет обработан, так как A упорядочен до и до того момента, когда он дойдет до B MyService. Однако он не работает при использовании в третьем проекте, который включает эти банки. Похоже, что аннотация AutoConfigureOrder пропускается при загрузке этих банок из пути к классам, и эти конфигурации обрабатываются в том порядке, в котором jvm загружает эти классы. В моем конкретном случае это B сначала, и в этот момент MyService еще не определен и, таким образом, будет создавать экземпляр компонента RealService. Как я могу заставить это работать?

Очевидно, что это небольшой пример, когда аннотация @Primary на mock будет выполнять эту работу, но это не то, что я ищу.

Редактирование: кажется, что аннотация @SpringBootApplication main не является частью пакета, в котором эти конфигурации тогда работают. Например. аннотация не находится в «org.packages.package», но «org.somewhereelse», тогда все работает.

package org.packages.package; 

@SpringBootApplication 
public class TestApplication { 

    public static void main(String[] args) throws Exception { 
    SpringApplication.run(Collections.singletonList(TestApplication.class).toArray(), args); 
    } 
} 

ответ

0

@AutoConfigureBefore и @AutoConfigureAfter применяются только тогда, когда класс конфигурации загружаются в результате автоконфигурирования быть включены и быть перечислены в spring.factories. Когда ваши классы автоматической конфигурации находятся в org.packages.package (или подпакетах), а ваш основной класс приложения находится в одном пакете, они обнаруживаются при сканировании стандартных компонентов Spring Framework. Это происходит потому, что @SpringBootApplication позволяет сканировать компонент для пакета класса, который он аннотирует. В результате этого порядок автоматической настройки не применяется.

Чтобы избежать этой проблемы, вы должны разместить классы автоматической настройки в пакете, который не используется никаким кодом приложения.

+0

Спасибо Энди, это действительно то, что решило мою проблему. Странным было то, что когда оба класса конфигурации и @SpringBootApplication, где они использовались сами (например, не как барабан зависимости в другом проекте), они работали правильно. Я не знаю, было ли это просто удачей, или что весенняя загрузка ведет себя по-другому в этом случае. Идите, ответ принят. Благодаря! –

Смежные вопросы