我有一个家长班
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();
感谢您的帮助/建议!
答案 0 :(得分:0)
您有两个HomePage
实例的bean:homePage
和webHomePage
。
因此,以这种方式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");