SpringBoot将BeanNameGenerator配置为使用限定符名称

问题描述

我正在使用proguard混淆代码并处理重复的bean定义名称,我正在使用自定义bean名称生成器来注册具有完全限定名称的bean。

public static class CustomGenerator implements BeanNameGenerator {

    @Override
    public String generateBeanName(BeanDeFinition deFinition,BeanDeFinitionRegistry registry) {
        return deFinition.getBeanClassName();

    }
}

然后我要使用自定义名称生成器创建应用程序上下文

ApplicationContext ctx = new SpringApplicationBuilder(DataQualityApplication.class)
            .beanNameGenerator(new CustomGenerator())
            .run(args);

但是,问题在于,现在正在使用其对应的类类型而不是通过@Qualifier@Component中提供的限定符名称注册Bean。 如何在我的项目中实现?

解决方法

如果使用类名作为bean名称,则意味着每种类型只能有一个bean。在这种情况下,只能按类型进行注入,只需删除@Qualifer并且不要命名您的bean,这应该可以正常工作。如果同一类有多个bean,则不能使用生成器。

,

通过扩展AnnotationBeanNameGenerator而不是实现BeanNameGenerator接口来解决它

public static class CustomGenerator extends AnnotationBeanNameGenerator {

    @Override
    public String generateBeanName(BeanDefinition definition,BeanDefinitionRegistry registry) {

        UnaryOperator<String> fun=pkgName->{
             int lastIndex = pkgName.lastIndexOf ('.');
            if (lastIndex!=-1){  
                pkgName=pkgName.substring (0,lastIndex);
            }
            return pkgName;
        };
        String className = super.generateBeanName(definition,registry);
        String packagename = definition.getBeanClassName();
        return (fun.apply(packagename) + "." + className);
    }
}

如果带注释,则返回带限定符/组件名称的完全限定名称。 解决Proguard jar中重复的bean定义错误。