当父类和子类是组件时,出现NoUniqueBeanDefinitionException

时间:2018-07-09 09:27:05

标签: java spring

我有一个家长班

package com.org.pages.home;

@Component
public class HomePage extends BasePage {

}

我有一个子类

package com.org.pages.home;

@Component
public class WebHomePage extends HomePage {

}

当我尝试通过以下方式获取HomePage实例时:

T page = applicationContext.getBean(registeredClass);
//Here registeredClass is of the type Class<T> and contains reference to com.org.pages.home.HomePage

它引发异常:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.org.pages.home.HomePage' available: expected single matching bean but found 2: homePage,webHomePage

问题
1.当我清楚地传递要获取bean的类时,为什么会看到此异常?

2.我该如何解决?请注意,我无法在任何地方自动连接这些类,因为它们大约有40个,这就是为什么我使用

实例化它们的原因
applicationContext.getBean();

感谢您的帮助/建议!

2 个答案:

答案 0 :(得分:0)

您有两个HomePage实例的bean:homePagewebHomePage
因此,以这种方式homePage调用getBean(Class clazz)时,Spring并不知道您想要哪个ApplicationContext.getBean(HomePage.class)实例。

请注意,如果您调用ApplicationContext.getBean(WebHomePage.class),则可以使用它,因为它只有一个WebHomePage实例。

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

HomePage homePage = ApplicationContext.getBean("homePage")

或:

HomePage homePage = ApplicationContext.getBean("webHomePage")

  

请注意,我无法自动连接这些课程   大约有40个地方,这就是为什么我   使用

实例化它们

我真的不明白为什么您不能使用@@utowired。您应该将咖啡豆自动接线到需要它们的地方。
一枪检索40个bean将对您的方法和类承担太多责任。

答案 1 :(得分:0)

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

@Qualifier("beanName")

用于按bean名称进行匹配。

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

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

@Component
@Qualifier("webHomePage")
public class WebHomePage extends HomePage {

}

现在,您可以使用以下命令获取HomePage bean:

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