簡體   English   中英

處理 DuplicateBeanException 的通用方法

[英]Generic way to handle DuplicateBeanException

團隊,我正在開發一個使用許多其他第三方庫的 Spring 啟動應用程序。 所有這些庫都建立在 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();
   }

}

當您通過@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 名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM