测试类中的接口getBean

时间:2013-07-15 07:49:25

标签: java spring junit

我有界面

@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

2 个答案:

答案 0 :(得分:2)

Spring托管组件是某些东西的“真实实例”,因此它们必须始终是具体实现的实例(必须是具体类)。您不能创建接口或抽象类的实例。

请注意,这与类型无关(可能会让您感到困惑):当然,此类实例在具体类的类型层次结构中属于任何类型。在您的示例中,B的实例是B类和A类。

答案 1 :(得分:1)

Spring需要一个具体的“东西”才能创建一个bean。因此@Component放错地方(应该在B上)。同样适用于以未来bean为目标的@Scope(具体而言)。