Spring 重写bean定义不';I don’我没有按预期工作
我被Spring基于注释的配置弄糊涂了 我有一个接口MyInterface和两个实现该接口的类(MyClass1和MyClass2)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
@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是丢失的那块。