java - 具有继承的重叠 Spring bean 名称

标签 java spring inheritance

我在github上发布了一些示例代码,所以我不会在这里包括长代码片段,请查看:https://github.com/ralf-lackinger/spring-inheritance/tree/master

我有一个 Parent 和一个 Child,它们都是 Spring bean。当我想通过 bean 的名称通过 BeanFactory 检索 Parent 时,将返回 Child 的实例。这给我带来了问题,因为我希望它们有不同的名称并只返回特定的名称,因为子类覆盖了我从父类(super class)使用的方法:

parent 姓名:parent, parentName1, parentName2
child 名字:child,childName1,childName2

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

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

我正在使用:
Java 版本“1.8.0_66”
Spring 4.2.3.RELEASE

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

感谢@oailloud 的帮助。

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

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

child :

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

解决方案是重命名为 Child 的方法,这样 child 就不会选择 Parent 的额外 bean 名称。

最佳答案

这是因为您要覆盖子类中的方法 additionalBeanNames。我猜 Spring 会混淆并使用来自父级 @Bean 的信息创建一个 Child。 只需重命名 Child 类中的 additionalBeanNames() 方法,并使用 @Bean(name="...") 明确命名 bean。< br/> 如果您需要分解这两种方法之间的代码,只需将其提取到第三个 protected 方法中即可。

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

关于java - 具有继承的重叠 Spring bean 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34180196/

相关文章:

java - Java 中的 XML 解析/Dom 操作

java - 你如何摆脱 ConfigurationPropertiesRebinderAutoConfiguration INFO 日志消息

java - 是否可以仅通过重定向允许访问页面?

python - python中的平等和继承

java - 当子类在另一个包中时无法覆盖父类(super class)的抽象方法

java - 将表名作为准备语句的参数传递

Java - 在特殊情况下关闭类字段的 Spring 验证

java - 安卓。如何克隆可编辑

java - 为什么 Spring Data 的 MongoRepository 如此有限?

c# - 将多态列表合并为一个列表并获取派生类型