【问题标题】:SpringBoot configuring BeanNameGenerator to use Qualifier namesSpring Boot 配置 Bean Name Generator 以使用 Qualifier 名称
【发布时间】:2020-09-03 11:29:51
【问题描述】:

我正在使用 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 中提供的限定符名称来注册的。 如何在我的项目中实现这一点?

【问题讨论】:

  • 只需扩展默认的 (AnnotationBeanNameGenerator) 并覆盖 buildDefaultBeanName 方法以使用您拥有的逻辑。这将保持原始行为,并且当没有明确的名称使用完整的类名时。
  • 是的,使用确切的方法解决了问题

标签: java spring spring-boot proguard


【解决方案1】:

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

【讨论】:

  • 为什么这么复杂,您应该重写 buildDefaultBeanName 方法并返回名称。您当前正在处理所有内容,这不是必需的。如果通过@Component(name="foo") 给出显式名称,它现在也会修改名称。如果您使用的限定符或基于名称的注入将开始失败,则名称现在将更改为 your.package.foo 而不仅仅是 foo
  • 感谢您的建议,添加了更改。
【解决方案2】:

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

【讨论】:

  • 有没有一种方法可以在我的名称生成器中使用限定符名称而不是 return definition.getBeanClassName(); 以便它注册具有限定符名称的 bean 并且对于所有其他人使用类名
猜你喜欢
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多