问题描述
我正在使用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定义错误。