Spring 重写bean定义不';I don’我没有按预期工作

Spring 重写bean定义不';I don’我没有按预期工作,spring,spring-bean,Spring,Spring Bean,我被Spring基于注释的配置弄糊涂了 我有一个接口MyInterface和两个实现该接口的类(MyClass1和MyClass2) @Component("MyInterface") public class MyClass1 implements MyInterface { public void execute() { System.out.println("MyClass1 executed"); } } public class MyClass2 i

我被Spring基于注释的配置弄糊涂了

我有一个接口MyInterface和两个实现该接口的类(MyClass1和MyClass2)

@Component("MyInterface")
public class MyClass1 implements MyInterface {

    public void execute() {
        System.out.println("MyClass1 executed");
    }
}

public class MyClass2 implements MyInterface {

    public void execute() {
        System.out.println("MyClass2 executed");
    }
}
MyClass1是使用组件扫描创建的,MyClass2被定义为一个bean:

@Configuration
@ComponentScan(basePackageClasses = MyClass1Configuration.class)
public class MyClass1Configuration {

}

@Configuration
public class MyClass2Configuration {

    @Bean(name = "MyInterface")
    public MyInterface myClass2() {
        return new MyClass2();
    }
}
我使用Spring测试的ContextConfiguration注释构建应用程序上下文:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {MyClass1Configuration.class, MyClass2Configuration.class})
public class SpringTestCase1 {

    @Autowired
    private MyInterface myInterface;

    @Test
    public void testMethod() {
        System.out.println("testMethod invoked");
        Assert.assertEquals(MyClass2.class, myInterface.getClass());
        myInterface.execute();
    }
}
不幸的是,测试失败了,因为Class1是自动连接的,而不是Class2。预期的行为是MyClass2Configuration覆盖由MyClassConfiguration定义的bean。是我的错

我在GitHub创建了这个示例,如果您想查看一个工作示例:

谢谢你的帮助

问候
奥利弗

你离。。。首先,在同一个Spring上下文中不能有两个同名的bean,除非您特别允许,我不建议这样做,因为它容易出错

除此之外,还应该使用,它可以在方法和类型级别应用。在您的情况下,您应该在
MyClass2Configuration
中的方法级别应用它:

@Configuration
public class MyClass2Configuration {

    @Bean
    @Primary
    public MyInterface myClass2() {
        return new MyClass2();
    }
}

由于您是按类型(而不是按名称)自动连接的,因此专门允许重写bean定义似乎没有什么用处。您可以让这两个bean都生活在Spring上下文中,然后通过
@Primary
注释,Spring将自动连接您的“Primary”bean实例。

或者您可以使用

spring.main.allow bean定义重写=true

在main/resource/application.properties中


但它容易出错

一些spring版本出现问题,我试图将版本从2.1.3更改为2.0.2.0版本。它开始工作了

谢谢,@Primary是丢失的那块。