【问题标题】:Generic way to handle DuplicateBeanException处理重复 Bean 异常的通用方法
【发布时间】:2021-10-17 07:27:54
【问题描述】:

团队,我正在开发一个使用许多其他第三方库的 Spring Boot 应用程序。 所有这些库都建立在 spring 核心之上。 通常出现的常见问题是DuplicateBeanException。 假设如果不同库中的 bean-name 相同,那么 spring 在尝试启动服务器时会抛出错误。因为我无法控制第三方罐子。我必须在我的应用程序中重命名 bean:下面是我为处理这种情况而编写的代码 sn-p。但这不是一个有效的解决方案,因为将来可能会再次出现一些重复的 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();
   }

}

【问题讨论】:

    标签: java spring spring-boot spring-mvc


    【解决方案1】:

    当您通过 @ComponentScan 配置从外部库扫描 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名。

    【讨论】:

      猜你喜欢
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      相关资源
      最近更新 更多