DddAutoConfiguration.java

package org.sanmibuh.ddd.infrastructure;

import java.util.List;
import org.sanmibuh.ddd.port.CommandBus;
import org.sanmibuh.ddd.port.CommandHandler;
import org.sanmibuh.ddd.port.DomainEventHandler;
import org.sanmibuh.ddd.port.EventBus;
import org.sanmibuh.ddd.port.QueryBus;
import org.sanmibuh.ddd.port.QueryHandler;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;

@AutoConfiguration
public class DddAutoConfiguration {

  @Bean
  static BeanDefinitionRegistryPostProcessor domainEventHandlerRegistrar(
      final BeanFactory beanFactory) {
    return new DomainEventHandlerRegistrar(beanFactory);
  }

  @Bean
  static BeanDefinitionRegistryPostProcessor cqrsHandlerRegistrar(final BeanFactory beanFactory) {
    return new CQRSHandlerRegistrar(beanFactory);
  }

  @Bean
  @ConditionalOnMissingBean(EventBus.class)
  public InMemoryEventBus eventBus(final List<DomainEventHandler<?>> handlers) {
    return new InMemoryEventBus(handlers);
  }

  @Bean
  @ConditionalOnMissingBean(CommandBus.class)
  public InMemoryCommandBus commandBus(
      final List<CommandHandler<?, ?>> handlers, final EventBus eventBus) {
    return new InMemoryCommandBus(handlers, eventBus);
  }

  @Bean
  @ConditionalOnMissingBean(QueryBus.class)
  public InMemoryQueryBus queryBus(final List<QueryHandler<?, ?>> handlers) {
    return new InMemoryQueryBus(handlers);
  }
}