调用@Bean批注方法时的行为不同

时间:2019-05-02 19:18:01

标签: java spring

我知道从@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有何不同?

1 个答案:

答案 0 :(得分:4)

使用setButtonParams注释的代理方法调用的“魔术”,从Spring上下文返回实例仅在配置bean中发生(例如:@Bean)。

但是,当您将新实例创建为@SpringJUnitConfig(MyBean.class)时,return new MyBean()注释将被忽略,并且该对象将注册为普通bean(@Configuration),而不是配置。这就是方法调用@Bean MyBean myBean()总是创建一个新实例的原因。