spring配置类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(KafkaRpcScanRegistrar.class)
public @interface KafkaRpcScan {
String[] value() default {};
Class<? extends KafkaRpcBean> factoryBean() default KafkaRpcBean.class;
}
注解类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(MapperScannerRegistrar.class)
public @interface KafkaRpcClient {
String topic();
String replyTopic();
String value();//beanName 对方调用的Controller对应的 类上RequestMap
}
对接口解析加入springbean
public class KafkaRpcScanRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware,ApplicationContextAware {
private ResourceLoader resourceLoader;
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
AnnotationAttributes annoAttrs = AnnotationAttributes
.fromMap(importingClassMetadata.getAnnotationAttributes(KafkaRpcScan.class.getName()));
String[] packs = annoAttrs.getStringArray("value");
Class<? extends Object> factoryBean = annoAttrs.getClass("factoryBean");
AnnotatedTypeScanner beanScanner = new AnnotatedTypeScanner(KafkaRpcClient.class);
Set<Class<?>> beanDefinitions = beanScanner.findTypes(packs);
for (Class<?> bd : beanDefinitions) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(bd);
GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
definition.getPropertyValues().add("rpcInterface", definition.getBeanClassName());
definition.getPropertyValues().add("context", context);
definition.setBeanClass(KafkaRpcBean.class);
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
String beanName=bd.getSimpleName().substring(0, 1).toLowerCase()+bd.getSimpleName().substring(1);
registry.registerBeanDefinition(beanName, definition);
}
}
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
private Applica