我有一些示例代码发布到github,所以我不会在这里包含长代码片段,请参阅:https://github.com/ralf-lackinger/spring-inheritance/tree/master
我有一个Parent
和一个Child
,都是春豆.当我想Parent
通过BeanFactory
bean的名称检索via时,Child
返回一个实例.这会给我带来问题,因为我希望它们具有不同的名称并仅返回特定的名称,因为子类会覆盖我从超类中使用的方法:
父名称:parent,parentName1,parentName2
子名称:child,childName1,childName2
简短的代码示例,请参阅我的github存储库以获取完整的代码示例:
context.getBean("parentName1", Parent.class).print();
返回:
Print from child.
也许有一个使用Spring的限定符的解决方案,但我不确定这是否有效.我已经尝试过@Primary
注释,但没有帮我解决这个问题.
我正在使用:
java版"1.8.0_66"
Spring 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名称.
这是因为你覆盖了additionalBeanNames
Child类中的方法.我想Spring会感到困惑并Child
使用来自Parent的信息创建一个@Bean
.只需additionalBeanNames()
在您的Child
类中重命名方法,并明确地命名bean @Bean(name="...")
.
如果您需要在这两种方法之间分解代码,只需在第三种受保护的方法中提取它.
另外,请注意:您要为每个类创建两个实例.一个是因为注释的方法@Bean
,另一个是因为@Component
.在这种情况下,实例是从类名中命名的.这就是为什么你的上下文中有"父"和"子"bean的原因.