Spring Framework: ContextRefreshedEvent запускается несколько раз

#spring #spring-boot

#весна #spring-boot

Вопрос:

В определенных случаях, например, при включении привязки к Spring app @EnableBinding , ContextRefreshedEvent запускается несколько раз.

Например,

 public interface MessageBinding {
    @Input("test")
    KStream<Long, String> messagesIn();
}

@EnableBinding(MessageBinding.class)
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Component
    public static class ComponentX {

        @Autowired
        ApplicationContext applicationContext;

        @EventListener
        public void onApplicationEvent(ContextRefreshedEvent event) {
            System.out.println("Fired event");
        }
    }
 

Если вы удалите @EnableBinding аннотацию, ContextRefreshedEvent она будет запущена только один раз.

Если вы добавите его, событие будет запущено 5 раз.

Ответ №1:

Вам нужно будет проверить ваш конкретный ApplicationContext следующим образом:

 @Autowired
ApplicationContext applicationContext;

@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
    if (event.getApplicationContext().equals(this.applicationContext)) {
        System.out.println("Fired only once!");
    }
}