java - SpringBoot 配置 BeanNameGenerator 以使用限定符名称
问题描述
我正在使用 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
or中提供的限定符名称@Component
。我怎样才能在我的项目中实现这一点?
解决方案
通过扩展 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 定义错误。
推荐阅读
- java - 具有自定义嵌套类型的 Ant 任务
- google-bigquery - BigQuery - 不能对范围聚合使用不同的计数
- apache-spark - kafka.common.KafkaException:错误的请求类型 18
- javascript - Javascript:选择 2 个单独的列表(选择选项)后执行 3 个操作
- javascript - 如何使用函数检查Hashmap的键和值然后返回输出?
- ios - ios UITabBarcontroller 自定义,如何实现如下tabbar架构师
- encryption - 可以为端到端加密的每条消息更改密钥对吗?
- javascript - 一页中不固定数量正方形的CSS大网格
- autoscaling - Spinnaker + AWS Autoscaling 生命周期挂钩
- llvm - 无效的 shufflevector 操作数!LLVM JavaCPP