java - 调用@Bean 注释方法的不同行为

标签 java spring

我知道从 @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/

相关文章:

java - 自定义 RDD 的分区提示

必须指定 Spring Security authenticationmanager - 用于自定义过滤器

Java8 : stream findFirst result

java - Guava eventbus 调度错误

java - 用于大型数据集二分搜索的数据结构

java - 在 smali 中设置可取消 true

java - 调用资源的 createOrWaitForConnection 方法时连接不可用?

spring - Spring 中 Hibernate 数据库生成错误

java - Spring 3+。通过占位符中的前缀解析属性

java - 从 3 个不同的单声道创建实体