为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Smart猫小萌 2021-05-05 18:34:50
我有一个家长班package com.org.pages.home;@Componentpublic class HomePage extends BasePage {}我有一个子类package com.org.pages.home;@Componentpublic 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 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

您有两个HomePage实例bean :homePagewebHomePage
这样,Spring不会以这种方式homePage调用您想要的实例。 getBean(Class clazz)ApplicationContext.getBean(HomePage.class)

请注意,如果您调用ApplicationContext.getBean(WebHomePage.class),它将在您具有的单个实例的情况下工作WebHomePage

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

HomePage homePage = ApplicationContext.getBean("homePage")

或者 :

HomePage homePage = ApplicationContext.getBean("webHomePage")

请注意,我无法在任何地方自动连接这些类,因为它们大约有40个,这就是为什么我使用实例化它们

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


查看完整回答
反对 回复 2021-05-19
?
达令说

TA贡献1821条经验 获得超6个赞

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


@Qualifier("beanName")

用于按bean名称进行匹配。


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


@Component

@Qualifier("homePage")

public class HomePage extends BasePage {

}


@Component

@Qualifier("webHomePage")

public class WebHomePage extends HomePage {


}

现在,您可以使用以下代码获取HomePagebean:


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


查看完整回答
反对 回复 2021-05-19
  • 2 回答
  • 0 关注
  • 227 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信