Java 用继承重叠Springbean名称

Java 用继承重叠Springbean名称,java,spring,inheritance,Java,Spring,Inheritance,我在github上发布了一些示例代码,因此这里不包含长代码片段,请参见: 我有一个家长和一个孩子,都是SpringBean。当我想通过BeanFactory以bean的名称检索父级时,将返回子级的实例。这给我带来了问题,因为我希望它们有不同的名称,并且只返回特定的名称,因为子类重写了我从超类使用的方法: 父项名称:父项、父项名称1、父项名称2 子名称:Child、childName1、childName2 短代码示例,有关完整代码示例,请参阅我的github存储库: context.getBea

我在github上发布了一些示例代码,因此这里不包含长代码片段,请参见:

我有一个
家长
和一个
孩子
,都是SpringBean。当我想通过
BeanFactory
以bean的名称检索
父级
时,将返回
子级
的实例。这给我带来了问题,因为我希望它们有不同的名称,并且只返回特定的名称,因为子类重写了我从超类使用的方法:

父项名称:父项、父项名称1、父项名称2
子名称:Child、childName1、childName2

短代码示例,有关完整代码示例,请参阅我的github存储库:
context.getBean(“parentName1”,Parent.class).print()
返回:
从子级打印。

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

我正在使用:
java版本“1.8.0_66”
弹簧4.2.3.释放

编辑:
我用一个名为“固定名称冲突”的分支更新了github存储库,其中包含了解决问题所需的更改。有关更多信息,请参见公认的答案(以及其中的commons)

谢谢@oailloud的帮助

编辑2:
问题在于这些方法:
Parent:

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

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

解决方案是重命名为
Child
的方法,这样子对象就不会选择
父对象的附加bean名称。

这是因为您正在覆盖子类中的方法
附加bean名称。我猜Spring会感到困惑,并用父
@Bean
的信息创建了一个子
。
只需重命名
子类中的
additionalBeanNames()
方法,并使用
@Bean(name=“…”)

如果需要在这两个方法之间分解代码,只需在第三个受保护的方法中提取代码


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

我不太了解Spring源代码,但是如果我不得不猜测,我会认为他们可能使用反射来查找注释,这就是为什么
获取名称。但这并不能解释为什么
父节点
还有来自
子节点
的附加名称(还有来自
@组件
注释的名称)。我刚刚编辑了我的答案:@Component是正常的,Spring将创建一个bean“父节点”和一个bean“子节点”。您可以在@Component值中重命名它们。父对象没有子对象的名称。只是,如果您在上下文中获得所有的
父类
bean,那么每个继承将包括
子类
bean。我知道
@组件
注释有自己的名称,为了获得其他名称,我使用了“bean lite模式”(在Spring文档中称为)。您对
Parent
bean名称的理解是正确的,子名称来自所有子类的上下文和父类本身,因此
Parent
bean的行为似乎与我的main方法中预期的一样。对不起,我忘了。谢谢但是,有没有一种方法可以通过bean名称来确定
Parent
而不是
Child
呢?我会这样做:更改
Child.additionalBeanNames()的名称,这样就没有
Child
获取“parentName1”作为bean名称,然后通过名称来获取
Parent
bean(“parentName1”就是这样的例子).这很有效,有助于我解决问题,谢谢。请把你最后的评论也包括在你的回答中,我会接受的。再次感谢您的时间和努力。如果你有任何关于这些信息来源的链接,请也包括在内,这样我就有更多的参考资料供进一步提问和了解更多信息。这似乎违反了Liskov替换原则。这并不意味着它是自动错误的——原则可能更像是一个指导原则,而不是一个硬性规定。但这是需要记住的。