2个具有相同名称但位于不同包中的bean;如何自动装配它们?

时间:2012-06-13 12:50:14

标签: spring inversion-of-control autowired

我有一个应用程序有2个具有相同名称的bean,但它们位于不同的包中。我的Spring应用程序失败,因为它无法决定采用哪个bean。这有什么解决方案吗? bean目前没有实现特定的接口。

见以下编辑的例外示例:

Caused by:
org.springframework.context.annotation.ConflictingBeanDefinitionException:
Annotation-specified bean name 'dataTransferHandler' for bean class
[aaaaa.ws.handler.DataTransferHandler] conflicts with existing,
non-compatible bean definition of same name and class
[bbbbb.ws.handler.DataTransferHandler]

3 个答案:

答案 0 :(得分:19)

你必须给你的bean提供不同的名字 - 如果用同一个名字定义多个bean,那么后面定义的bean将覆盖之前定义的那个 - 所以在你的情况下只有一个bean存在,其名称为{{ 1}}。

您可以为这两个bean提供不同的名称,这样两者都可以存在,您可以使用以下方法注入正确的名称: dataTransferHandler 要么 @AutoWired @Qualifier("dataTransferHandler")

答案 1 :(得分:2)

您可以将属性 primary =“true”赋予您想要在自动装配时具有首选项的bean定义。但bean名称必须不同。相同的bean名称没有解决方案。

在运行时,当您获得自动装配的类时,主真实bean将获得自动装配的首选项。希望这对你有所帮助。欢呼声。

答案 2 :(得分:0)

我问了关于同一问题的另一个问题,并且有一个解决方案不需要使用@Qualifier批注:如果两个DataTransferHandler类都具有@Component批注,则只需将String参数添加到其中一个即可。它们的构造(即@Component(“ Foo”)),这样就可以解决问题,而无需进行其他更改。

有关更多详细信息,请参见User9123's answer on my question