我有界面
@Component("a")
@Scope("prototype")
Public interface A{
.....
}
和实现接口a
的 b类public class B implement A{
...
}
和Junit测试类
public class PartyTest {
private static BeanFactory factory = null;
@BeforeClass
public static void loadSpring() {
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext(new String[]{"/spring/mainContext.xml"});
factory = (BeanFactory) applicationContext;
}
@Test
public void personSaveTest() {
A a = (A) factory.getBean("a");
}
}
它抛出
org.springframework.beans.factory。 NoSuchBeanDefinitionException :没有定义名为'a'的bean。
我的问题是,为什么我无法加载界面?如果我在课程@Component("b")
的顶部使用b
,则可以加载课程B
,但无法加载interface A
。
答案 0 :(得分:2)
Spring托管组件是某些东西的“真实实例”,因此它们必须始终是具体实现的实例(必须是具体类)。您不能创建接口或抽象类的实例。
请注意,这与类型无关(可能会让您感到困惑):当然,此类实例在具体类的类型层次结构中属于任何类型。在您的示例中,B的实例是B类和A类。
答案 1 :(得分:1)
Spring需要一个具体的“东西”才能创建一个bean。因此@Component
放错地方(应该在B
上)。同样适用于以未来bean为目标的@Scope
(具体而言)。