我知道从@Bean
内以already discussed调用@Configuration
注释的方法。
但是我不明白为什么当bean被覆盖时它不起作用。
我有一个无法修改的旧类。它是一个配置,同时是一个业务Bean。这是一个简化的版本:
@Configuration
public class MyBean {
String someMethod() {
return otherBean() + "|" + otherBean();
}
int called = 0;
@Bean
Object otherBean() {
return called ++;
}
}
在someMethod()
内部,工厂方法otherBean()
被调用了两次,并以@Bean
注释,该实例应从Spring上下文中获取,因此实际代码{{ 1}}仅被调用一次。 return called ++;
的预期输出应始终为someMethod()
,并且在生产中确实如此。
当我要在单元测试中重新定义bean时出现问题:
0|0
原因可能是测试中@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
配置并将测试上下文的配置设置为0|0
时,一切都会再次起作用(结果为TestConfig
)。
在测试中注册Bean有何不同?
答案 0 :(得分:4)
使用setButtonParams
注释的代理方法调用的“魔术”,从Spring上下文返回实例仅在配置bean中发生(例如:@Bean
)。
但是,当您将新实例创建为@SpringJUnitConfig(MyBean.class)
时,return new MyBean()
注释将被忽略,并且该对象将注册为普通bean(@Configuration
),而不是配置。这就是方法调用@Bean MyBean myBean()
总是创建一个新实例的原因。