0

我有一个界面

@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

4

2 回答 2

2

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

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

于 2013-07-15T08:01:07.083 回答
1

Spring需要一个具体的“东西”来创建一个bean。所以@Component是放错地方了(应该是 on B)。@Scope哪个目标是未来的 bean 也是如此(所以是具体的)。

于 2013-07-15T08:00:37.290 回答