[英]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.