2016-08-05 5 views
3

С весной AbstractRefreshableApplicationContext, я могу заставить Spring потерпеть неудачу, если есть конфликт идентификаторов Bean или циклических ссылки, установив пару флагов и освежающего контекст, как так:Есть ли способ предотвратить перебор бобов с помощью Spring Boot?

AbstractRefreshableApplicationContext refreshableContext; 
... 
refreshableContext.setAllowBeanDefinitionOverriding(false); 
refreshableContext.setAllowCircularReferences(false); 
refreshableContext.refresh(); 

Однако, Spring Загрузочный возвращается a ConfigurableApplicationContext, который не является экземпляром AbstractRefreshableApplicationContext и, по-видимому, не имеет средств для предотвращения переопределения или циклических ссылок.

Кто-нибудь знает способ и пример того, как предотвратить подобные конфликты?

Для контекста это для большого проекта, который содержит сочетание аннотированных и xml определенных bean-компонентов. Используемая версия Spring Boot - 1.3.1.RELEASE. Были случаи, когда люди добавляли в xml повторяющиеся определения bean-компонентов, но приложение запускалось нормально, и сразу не было видно, что исходный bean-компонент был переопределен до тех пор, пока не возникли проблемы с запуском.

Целью здесь является предотвращение запуска приложения при возникновении такого конфликта. На различных форумах я знаю, что Spring IDE может их обнаружить, но желание обеспечить это в сборке CI, которая является более сильной сетью безопасности.

После некоторого поиска я не могу найти поддержку для этого в том контексте, который возвращает Sprint Boot. Если это невозможно сделать через контекст, существует ли другое решение?

Заранее спасибо.

+0

@Primary является вашим другом. И/@ Ресурс ... Первичный и ресурс -_- – Sarief

+0

Спасибо за предложение, но я не думаю, что это будет работать через контекст приложения, независимо от того, будет ли компонент из xml vs java. Я буду читать Javadocs для тех, кто увидит, когда я вернусь к своему столу. – Hazok

+0

он будет ловить бобы по id независимо от того, откуда он. Также Первичный идет первым. – Sarief

ответ

4

Вы можете использовать инициализатор при построении Spring загрузки приложения:

@SpringBootApplication 
public class SpringBootApp { 

    public static void main(String... args) { 
     new SpringApplicationBuilder(SpringBootApp.class) 
      .initializers(new ApplicationContextInitializer<GenericApplicationContext>() { 
       @Override 
       public void initialize(GenericApplicationContext applicationContext) { 
        applicationContext.setAllowBeanDefinitionOverriding(false); 
       } 
      }) 
     .run(args); 

    } 
} 

Или с Явы 8:

new SpringApplicationBuilder(SpringBootApp.class) 
    .initializers((GenericApplicationContext c) -> c.setAllowBeanDefinitionOverriding(false)) 
    .run(args); 
+0

Эта реализация выглядит так, как будто она соответствует тем, что я ищу. Попытка, и если все отлично работает, это будет принятый ответ с голосованием. – Hazok

+0

Это решение работает, и я успешно разрешил конфликты определения в приложении Spring Boot. Спасибо за ответ. На боковой ноте теперь появляется сообщение о том, что у меня есть сбой, возникший из контекста веб-приложения Spring Boot, когда отключено переопределение параметра bean. Я собираюсь еще раз углубиться в этот новый вопрос и, возможно, в ближайшем будущем, возможно, возникнут новые вопросы по этой новой проблеме. – Hazok

+0

Вы выяснили вторую неудачу, возникшую из контекста веб-приложения Spring Boot? У меня такая же проблема. –

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