首页 > 解决方案 > NoUniqueBeanDefinitionException 当父类和子类是组件时

问题描述

我有一个父类

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();

感谢您的任何帮助/建议!

标签: javaspring

解决方案


默认情况下,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");

推荐阅读