
in.hocg.boot.netty.client.autoconfiguration.bean.CommandInvokerRegistrar Maven / Gradle / Ivy
package in.hocg.boot.netty.client.autoconfiguration.bean;
import in.hocg.netty.core.annotation.Invoker;
import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.util.StringUtils;
import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Getter
@Setter
public class CommandInvokerRegistrar implements ImportBeanDefinitionRegistrar, BeanFactoryAware {
private Class extends Annotation> annotationClass = Invoker.class;
private BeanFactory beanFactory;
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
List packages = AutoConfigurationPackages.get(this.beanFactory);
String basePackage = StringUtils.collectionToCommaDelimitedString(packages);
// String[] packages = StringUtils.tokenizeToStringArray(this.basePackage, ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
ClassPathScanningCandidateComponentProvider scanner = getScanner();
scanner.addIncludeFilter(new AnnotationTypeFilter(annotationClass));
Set beanDefinitions = scanner.findCandidateComponents(basePackage);
for (BeanDefinition candidateComponent : beanDefinitions) {
if (candidateComponent instanceof AnnotatedBeanDefinition) {
AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
Map attributes = annotationMetadata.getAnnotationAttributes(annotationClass.getCanonicalName());
registerInvokerBean(registry, annotationMetadata, attributes);
}
}
}
private void registerInvokerBean(BeanDefinitionRegistry registry, AnnotationMetadata annotationMetadata, Map attributes) {
BeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(InvokerFactoryBean.class);
String className = annotationMetadata.getClassName();
definition.addPropertyValue("type", className);
definition.addPropertyValue("channelType", attributes.get("value"));
definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();
// String alias = className + "Invoker";
BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className);
BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry);
}
protected ClassPathScanningCandidateComponentProvider getScanner() {
return new ClassPathScanningCandidateComponentProvider(false) {
@Override
protected boolean isCandidateComponent(
AnnotatedBeanDefinition beanDefinition) {
boolean isCandidate = false;
if (beanDefinition.getMetadata().isIndependent()) {
if (!beanDefinition.getMetadata().isAnnotation()) {
isCandidate = true;
}
}
return isCandidate;
}
};
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy