目前想实现的功能:
根据注解的参数决定import那个类,如果是A我注册serviceA, 如果是B 我注册serviceB
@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = {java.lang.annotation.ElementType.TYPE})
@Import({ImportRouteConfig.class})
public @interface EnableRouteConfig {
RouteConfigEnum value() default RouteConfigEnum.LOCAL;;
}
@RestController
@SpringBootApplication
@EnableRouteConfig(ConfigEnum.A)
public class SomeDemoApp {
1.方法1 实现 ImportBeanDefinitionRegistrar
public class ImportResisterConfig implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
Map<String, Object> attrMap = importingClassMetadata.getAnnotationAttributes(EnableRouteConfig.class.getName());
if (attrMap != null) {
Object obj = attrMap.get("value");
if (obj.equals(ConfigEnum.A)) {
RootBeanDefinition definition = new RootBeanDefinition(ServiceA.class);
registry.registerBeanDefinition("serviceA", definition);
return;
}
}
RootBeanDefinition definition = new RootBeanDefinition(ServiceB.class);
registry.registerBeanDefinition("serviceA", definition);
}
2.方法2 实现 ImportSelector
@Slf4j
public class ImportRouteConfig implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
Map<String, Object> attrMap = importingClassMetadata.getAnnotationAttributes(EnableRouteConfig.class.getName());
if (attrMap != null && ConfigEnum.A.equals(attrMap.get("value"))) {
return new String[]{"com.demo.AService"};
}
return new String[]{"com.demo.BService"};
}
}