我知道从 @Configuration
中调用 @Bean
注释方法作为 already discussed .
但是我不明白为什么覆盖bean时它不起作用。
我有一个遗留类,我无法修改它。它同时是一个配置和一个业务 bean。这是一个简化版本:
@Configuration
public class MyBean {
String someMethod() {
return otherBean() + "|" + otherBean();
}
int called = 0;
@Bean
Object otherBean() {
return called ++;
}
}
在 someMethod()
中,工厂方法 otherBean()
被调用了两次,只要用 @Bean
注释,实例应该从 Spring 上下文中获取,因此实际代码 return called++;
应该只调用一次。 someMethod()
的预期输出应始终为 0|0
,在生产中确实如此。
当我要在单元测试中重新定义 bean 时,麻烦来了:
@SpringJUnitConfig//(MyBean.class)
public class BeanTest {
@Autowired
MyBean myBean;
@Test
void testIt() {
assertEquals("0|0", myBean.someMethod());
}
@Configuration
static class TestConfig {
@Bean
MyBean myBean() {
return new MyBean();
}
}
}
原因可能是测试中 MyBean
实例的一些额外设置(未包含在上面的代码片段中)。
现在,调用 myBean.someMethod()
会返回 0|1
而不是 0|0
。
当删除 TestConfig
配置并将测试上下文的配置设置为 @SpringJUnitConfig(MyBean .class)
.
在测试中注册 bean 有什么不同?
最佳答案
使用 @Bean
注释的代理方法调用和从 Spring 上下文返回实例的“魔力”只发生在配置 bean 中(像这里:@SpringJUnitConfig(MyBean.class)
).
但是当你创建一个新的实例作为return new MyBean()
时,@Configuration
注释被忽略并且对象被注册为一个普通的bean( @Bean MyBean myBean()
) 但不是配置。这就是调用 otherBean()
的方法总是创建一个新实例的原因。
关于java - 调用@Bean 注释方法的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55958892/