Java 用继承重叠Springbean名称
我在github上发布了一些示例代码,因此这里不包含长代码片段,请参见: 我有一个Java 用继承重叠Springbean名称,java,spring,inheritance,Java,Spring,Inheritance,我在github上发布了一些示例代码,因此这里不包含长代码片段,请参见: 我有一个家长和一个孩子,都是SpringBean。当我想通过BeanFactory以bean的名称检索父级时,将返回子级的实例。这给我带来了问题,因为我希望它们有不同的名称,并且只返回特定的名称,因为子类重写了我从超类使用的方法: 父项名称:父项、父项名称1、父项名称2 子名称:Child、childName1、childName2 短代码示例,有关完整代码示例,请参阅我的github存储库: context.getBea
家长
和一个孩子
,都是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替换原则。这并不意味着它是自动错误的——原则可能更像是一个指导原则,而不是一个硬性规定。但这是需要记住的。