Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用@Bean注释方法时的不同行为_Java_Spring - Fatal编程技术网

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

Java 调用@Bean注释方法时的不同行为,java,spring,Java,Spring,我知道在@Configuration中调用@Bean注释的方法 但是我不明白为什么当bean被覆盖时它不工作 我有一个遗留类,无法修改。它同时是一个配置和一个业务bean。这是一个简化版本: @配置 公共类MyBean{ 字符串方法{ 返回otherBean+|+otherBean; } int=0; @豆子 对象其他bean{ 返回名为++; } } 在someMethod中,工厂方法otherBean被调用了两次,只要用@Bean注释,实例应该从Spring上下文中获取,因此实际代码应该返回

我知道在@Configuration中调用@Bean注释的方法

但是我不明白为什么当bean被覆盖时它不工作

我有一个遗留类,无法修改。它同时是一个配置和一个业务bean。这是一个简化版本:

@配置 公共类MyBean{ 字符串方法{ 返回otherBean+|+otherBean; } int=0; @豆子 对象其他bean{ 返回名为++; } } 在someMethod中,工厂方法otherBean被调用了两次,只要用@Bean注释,实例应该从Spring上下文中获取,因此实际代码应该返回++;只能叫一次。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配置并将测试上下文的配置设置为@SpringJUnitConfigMyBean.class时,结果是0 | 0


在测试中注册bean有什么不同?

用@bean注释的代理方法调用和从Spring上下文返回实例的魔力只发生在如下配置bean中:@SpringJUnitConfigMyBean.class


但是当您创建一个新实例作为returnnewmybean时,@Configuration注释被忽略,对象被注册为普通bean@bean MyBean MyBean,而不是配置。这就是为什么方法调用otherBean总是创建一个新实例。

代理带有@Bean注释的方法调用并从Spring上下文返回实例的魔力只发生在如下配置Bean中:@SpringJUnitConfigMyBean.class

但是当您创建一个新实例作为returnnewmybean时,@Configuration注释被忽略,对象被注册为普通bean@bean MyBean MyBean,而不是配置。这就是为什么调用otherBean的方法总是创建一个新实例