package io.muoncore.spring; import io.muoncore.spring.annotations.EnableMuon; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; import java.util.Map; public class AutoConfigurationBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { public static final String AUTO_CONFIGURATION_BEAN_NAME = "muonAutoConfiguration"; @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(EnableMuon.class.getName()); Object serviceNameCandidate = annotationAttributes.get("serviceName"); if (serviceNameCandidate != null && String.class == serviceNameCandidate.getClass()) { String serviceName = (String) serviceNameCandidate; BeanDefinitionBuilder definition = BeanDefinitionBuilder .genericBeanDefinition(AutoConfigurationFactoryBean.class); definition.addPropertyValue("serviceName", serviceName); definition.addPropertyValue("tags", annotationAttributes.get("tags")); BeanDefinitionReaderUtils.registerBeanDefinition( new BeanDefinitionHolder(definition.getBeanDefinition(), AUTO_CONFIGURATION_BEAN_NAME), registry); } } }