当前位置: 首页 > 知识库问答 >
问题:

处理DuplicateBeanException的通用方法

鲜于峰
2023-03-14

我正在开发一个Spring boot应用程序,它使用了很多其他第三方库。所有这些库都构建在spring核心之上。通常出现的常见问题是DuplicateBeanException。假设不同库中的bean-name相同,spring在尝试启动服务器时抛出错误。因为我不能控制第三方罐子。我必须重命名我的应用程序中的bean:下面是我为处理这个场景而编写的代码片段。但这不是一个有效的解决方案,因为将来可能会再次出现一些重复的bean。我如何以通用的方式解决它,以便当任何重复的bean出现时,我的应用程序可以处理和初始化这些bean。

我处理重复bean的代码:

@Configuration
public class ExternalBeanConfiguration {
   @Bean(employeeLib1)    
   public Employee getEmployee() {
          return new Employee();
   }

   @Bean(employeeLib2)    
   public com.another.library.Employee getEmployee() {
          return new com.another.library.Employee();
   }

}

共有1个答案

虞高雅
2023-03-14

当您通过@componetscan配置从外部库扫描bean的位置时,您可以指定beannameGenerator来定义检测到的bean的名称。

@Configuration
@ComponentScan(basePackages = { "com.foo.lib1" , "com.foo.lib2"}, nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class)
public class ExternalBeanConfiguration {
    
}

FullyQualifiedAnnotationBeannameGenerator正是用来解决javadoc中提到的问题:

如果由于多个自动检测到的组件具有相同的非限定类名(即,具有相同名称但位于不同包中的类)而导致命名冲突,请选择此bean命名策略而不是{@code AnnotationBeanNameGenerator}

它将bean命名为默认bean名称的完全限定类名,这样即使不同的包具有相同的类名,它仍然具有不同的bean名称。

 类似资料:
  • 本文向大家介绍在Django的通用视图中处理Context的方法,包括了在Django的通用视图中处理Context的方法的使用技巧和注意事项,需要的朋友参考一下 制作友好的模板Context 你也许已经注意到范例中的出版商列表模板在变量 object_list 里保存所有的书籍。这个方法工作的很好,只是对编写模板的人不太友好。 他们必须知道这里正在处理的是书籍。 更好的变量名应该是publish

  • 本文向大家介绍java通过jni调用opencv处理图像的方法,包括了java通过jni调用opencv处理图像的方法的使用技巧和注意事项,需要的朋友参考一下 1. 建立java文件 2. 切换到工程src文件夹 javac getImageFeature.java javah getImageFeature 生成 getImageFeature.h 文件 3. VS2013建立dll工程 添加g

  • 本文向大家介绍SpringCloud通用请求字段拦截处理方法,包括了SpringCloud通用请求字段拦截处理方法的使用技巧和注意事项,需要的朋友参考一下 背景 以SpringCloud构建的微服务系统为例,使用前后端分离的架构,每个系统都会提供一些通用的请求参数,例如移动端的系统版本信息、IMEI信息,Web端的IP信息,浏览器版本信息等,这些参数可能放在header里,也可以放在参数里,如果这

  • 一些批处理任务可以使用spring batch现成的组件完全的组装.例如ItemReader和ItemWriter实现可配置覆盖范围广泛的场景,然而,对于大多数情况下,必须编写自定义代码。应用程序开发人员的主要API人口点是Tasklet,ItemReader ItemWriter和各种各样的监听器接口.最简单的批处理任务能够使用Spring BatchItemReader现成的输出,但通常情况下

  • 问题内容: 我在Java中使用ResultSet,但不确定如何正确关闭它。我正在考虑使用ResultSet构造一个HashMap,然后在那之后关闭ResultSet。这种HashMap技术是有效的还是有更有效的方法来处理这种情况?我需要键和值,因此使用HashMap似乎是一个合理的选择。 如果使用HashMap是最有效的方法,如何在代码中构造和使用HashMap? 这是我尝试过的: 问题答案: 遍