Spring Boot 配置 Bean 名称生成器以使用限定符名称

SpringBoot configuring BeanNameGenerator to use Qualifier names

我正在使用混淆器来混淆我的代码并处理重复的 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);

然而,问题是 bean 现在是使用它们相应的 class 类型而不是 @Qualifier@Component 中提供的限定符名称来注册的。 我怎样才能在我的项目中实现这一目标?

如果使用 class 名称作为 bean 名称,这意味着每种类型只能有一个 bean。在这种情况下,注入只能按类型完成,只需删除 @Qualifer 并且不要命名您的 bean,这应该可以正常工作。如果同一个 class 有多个 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);
    }
}

此 returns 完全限定名称具有 qualifier/component 名称,如果另有注释 class 名称。 解决了 Proguard jar 中重复的 bean 定义错误。