使用继承重叠Spring bean名称

时间:2015-12-09 13:37:40

标签: java spring inheritance

我有一些示例代码发布到github,所以我不会在这里包含长代码片段,请参阅:https://github.com/ralf-lackinger/spring-inheritance/tree/master

我有一个Parent和一个Child,都是Spring bean。当我想通过bean的名称通过Parent检索BeanFactory时,会返回Child的实例。这会给我带来问题,因为我希望它们具有不同的名称并仅返回特定的名称,因为子类会覆盖我在超类中使用的方法:

父名:parent,parentName1,parentName2
子名:child,childName1,childName2

简短的代码示例,请参阅我的github存储库以获取完整的代码示例:
context.getBean("parentName1", Parent.class).print();
回报:
Print from child.

也许有一个使用Spring的限定符的解决方案,但我不确定这是否有效。我已经尝试了@Primary注释,但没有帮助我解决这个问题。

我正在使用:
java版“1.8.0_66”
春季4.2.3.RELEASE

编辑:
我使用名为“fixed-name-conflict”的分支更新了github存储库,其中包含了我需要进行的更改以解决我的问题。有关更多信息,请参阅已接受的答案(以及那里的公告)。

感谢@oailloud的帮助。

编辑2:
有问题的部分是这些方法:
Parent:

@Bean(name = {"parentName1", "parentName2"})
public Parent additionalBeanNames() {
    return new Parent();
}

Child

@Override
@Bean(name = {"childName1", "childName2"})
public Child additionalBeanNames() {
    return new Child();
}

解决方案是重命名为Child的方法,因此孩子不会获取Parent的其他bean名称。

1 个答案:

答案 0 :(得分:5)

这是因为你覆盖了Child类中的方法additionalBeanNames。我猜Spring会感到困惑,并使用父Child中的信息创建@Bean。 只需在additionalBeanNames()类中重命名Child方法,并使用@Bean(name="...")明确地命名豆类。
如果你需要在这两种方法之间分解代码,只需在第三种受保护的方法中提取它。

另外,请注意:您要为每个类创建两个实例。一个是因为使用@Bean注释的方法,另一个是因为@Component。在这种情况下,实例是从类名中命名的。这就是为什么你的上下文中有“父”和“子”豆。