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 定义错误。
我正在使用混淆器来混淆我的代码并处理重复的 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 定义错误。