package io.muoncore.spring.transport; import io.muoncore.spring.PropertiesHelper; import io.muoncore.transport.MuonTransportFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.*; import org.springframework.context.EnvironmentAware; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.env.Environment; import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.filter.AssignableTypeFilter; import java.util.Properties; public class MuonTransportFactoryBeanRegistrar implements ImportBeanDefinitionRegistrar, EnvironmentAware { public static final String MUON_PREFIX = "muon."; private Environment environment; @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); scanner.addIncludeFilter(new AssignableTypeFilter(MuonTransportFactory.class)); Properties properties = PropertiesHelper.populateConnectionProperties(environment, MUON_PREFIX); scanner .findCandidateComponents("io.muoncore.transport") .stream() .forEach(candidateComponent -> { final String beanClassName = candidateComponent.getBeanClassName(); BeanDefinitionBuilder definition = BeanDefinitionBuilder .genericBeanDefinition(MuonTransportFactoryBean.class); definition.addPropertyValue("type", beanClassName); definition.addPropertyValue("properties", properties); String beanName = BeanDefinitionReaderUtils.generateBeanName(definition.getBeanDefinition(), registry); final BeanDefinitionHolder beanDefinitionHolder = new BeanDefinitionHolder(definition.getBeanDefinition(), beanName); BeanDefinitionReaderUtils.registerBeanDefinition(beanDefinitionHolder, registry); }); } @Override public void setEnvironment(Environment environment) { this.environment = environment; } }