Spring Boot 2.1 Bean Override vs.Primary

在Spring Boot 2.1中,默认情况下禁用Bean覆盖,这是一件好事。

但是我确实有一些测试,其中我使用Mockito用模拟的实例替换了bean。使用默认设置时,具有此类配置的测试将由于Bean覆盖而失败。

我发现可行的唯一方法是通过应用程序属性启用bean覆盖:

spring.main.allow-bean-definition-overriding=true

但是,我真的很想确保为我的测试配置设置最少的bean定义,这将由spring在禁用覆盖的情况下指出。

我要覆盖的bean要么是

  • 在导入我的测试配置的另一个配置中定义
  • 通过注释扫描自动发现bean

我一直认为应该在覆盖Bean的测试配置中起作用并对其进行拍击@Primary,因为我们习惯于数据源配置。但是,这没有效果,让我感到奇怪:@Primary和禁用的Bean覆盖是否矛盾?

一些例子:

package com.stackoverflow.foo;

@Service

public class AService {

}

package com.stackoverflow.foo;

public class BService {

}

package com.stackoverflow.foo;

@Configuration

public BaseConfiguration {

@Bean

@Lazy

public BService bService() {

return new BService();

}

}

package com.stackoverflow.bar;

@Configuration

@Import({BaseConfiguration.class})

public class TestConfiguration {

@Bean

public BService bService() {

return Mockito.mock(BService.class);

}

}

回答:

覆盖bean意味着在上下文中可能只有一个具有唯一名称或ID的bean。因此,您可以通过以下方式提供两个bean:

package com.stackoverflow.foo;

@Configuration

public class BaseConfiguration {

@Bean

@Lazy

public BService bService1() {

return new BService();

}

}

package com.stackoverflow.bar;

@Configuration

@Import({BaseConfiguration.class})

public class TestConfiguration {

@Bean

public BService bService2() {

return Mockito.mock(BService.class);

}

}

如果添加,@Primary则默认情况下将在以下位置注入主bean:

@Autowired

BService bService;

以上是 Spring Boot 2.1 Bean Override vs.Primary 的全部内容, 来源链接: utcz.com/qa/419767.html

回到顶部