Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当父类和子类是组件时,NonuniqueBeandFinitionException_Java_Spring - Fatal编程技术网

Java 当父类和子类是组件时,NonuniqueBeandFinitionException

Java 当父类和子类是组件时,NonuniqueBeandFinitionException,java,spring,Java,Spring,我有一个家长班 package com.org.pages.home; @Component public class HomePage extends BasePage { } 我有一个小班 package com.org.pages.home; @Component public class WebHomePage extends HomePage { } 当我尝试以以下方式获取主页实例时: T page = applicationContext.getBean(register

我有一个家长班

package com.org.pages.home;

@Component
public class HomePage extends BasePage {

}
我有一个小班

package com.org.pages.home;

@Component
public class WebHomePage extends HomePage {

}
当我尝试以以下方式获取主页实例时:

T page = applicationContext.getBean(registeredClass);
//Here registeredClass is of the type Class<T> and contains reference to com.org.pages.home.HomePage
问题
1.当我明确地通过了我想要获得bean的类时,为什么我会看到这个异常?

2.我怎样才能解决这个问题?请注意,我无法在任何地方自动关联这些类,因为它们大约有40个,这就是我使用

applicationContext.getBean();

谢谢你的帮助/建议

您有两个bean,它们是
HomePage
实例:
HomePage
webHomePage

因此,Spring不知道在您以这种方式调用
ApplicationContext.getBean(homePage.Class)
时需要哪个
homePage
实例

请注意,如果调用
ApplicationContext.getBean(WebHomePage.class)
,它将起作用,因为您只有一个
WebHomePage
实例

作为检索bean的编程方式的替代方法,您可以通过传递bean名称来使用
ApplicationContext.getBean(字符串名称)
,例如:

HomePage HomePage=ApplicationContext.getBean(“主页”)

或:

HomePage HomePage=ApplicationContext.getBean(“webHomePage”)

请注意,我无法自动关联这些类 任何地方都有大约40个这样的人,这就是为什么我会这样 使用

我真的不明白为什么不能使用
@@utowired
。你应该把豆子自动连接到你需要的地方。

一次检索40个bean会给方法和类带来太多的责任

默认情况下,Spring框架会自动搜索匹配的bean。如果同一个类(包括子类)有多个bean,那么必须使用

@Qualifier("beanName")
用于按bean名称进行匹配

在您的情况下,您可以执行以下操作:

@Component
@Qualifier("homePage")
public class HomePage extends BasePage {
}

现在,您可以使用以下内容获取
主页
bean:

HomePage page = (HomePage)applicationContext.getBean("homePage");

WebHomePage
是一个
HomePage
当获取
HomePage
时,它不知道您想要哪个实例。如果我传递父类bean的名称,ApplicationContext.getBean(字符串名)会起作用吗?在某些情况下,我必须获取父类的实例。尝试一下,但我不明白为什么它不起作用。这里有两个bean:
homePage
webHomePage
。您应该能够通过指定它们来检索它们中的任何一个。我更新了一个例子。非常感谢@davidxxx。提供名字对我很有用。
@Component
@Qualifier("webHomePage")
public class WebHomePage extends HomePage {

}
HomePage page = (HomePage)applicationContext.getBean("homePage");