springboot配置beannamegenerator以使用限定符名称

piwo6bdm  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(384)

我使用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);

然而,问题是bean现在是使用它们相应的类类型注册的,而不是使用 @Qualifier 或者 @Component . 如何在我的项目中实现这一点?

wlzqhblo

wlzqhblo1#

如果将类名用作bean名,则意味着每个类型只能有一个bean。在这种情况下,注入只能通过类型来完成,只需删除@qualifier,不要给bean命名,这样就可以了。如果同一类有多个bean,就不能使用生成器。

csbfibhn

csbfibhn2#

通过扩展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定义错误。

相关问题