覆盖bean定义无法按预期工作

Oli*_*ver 2 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 implements MyInterface {

    public void execute() {
        System.out.println("MyClass2 executed");
    }
}
Run Code Online (Sandbox Code Playgroud)

通过使用组件扫描创建MyClass1,将MyClass2定义为bean:

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

}

@Configuration
public class MyClass2Configuration {

    @Bean(name = "MyInterface")
    public MyInterface myClass2() {
        return new MyClass2();
    }
}
Run Code Online (Sandbox Code Playgroud)

我通过使用Spring Test的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,该测试失败,因为自动连接了Class1,而不是Class2。预期的行为是MyClass2Configuration覆盖了MyClass1Configuration定义的bean。我怎么了

我想在GitHub上创建此示例,如果您想看一个工作示例:https : //github.com/OLibutzki/spring-test-configuration/tree/master/simple-sprint-test

谢谢你的帮助。

亲切的问候奥利弗

小智 5

或者您可以使用覆盖

spring.main.allow-bean-definition-overriding = true

在main / resource / application.properties中

但这容易出错