当前位置: 首页 > 知识库问答 >
问题:

使用非主bean重写主bean的Spring

韩阳云
2023-03-14

我试图在测试配置中使用@primary声明的测试期间覆盖Spring bean。一个声明位于src/main/java路径中,另一个声明位于src/test/java路径中。

从日志来看:

o.s.b.f.s.DefaultListableBeanFactory-用不同的定义重写bean“SQS ConnectionFactory”的bean定义:替换[根bean:class[null];scope=;abstract=false;lazyInit=false;autowiremode=3;dependencycheck=0;autowirecandidate=true;primary=true;factoryBeanname=testjmsconfiguration;factorymethodname=sqsConnectionFactory;initmethodname=null;

[根bean:class[null];scope=;abstract=false;lazyInit=false;autowiremode=3;dependencycheck=0;autowirecandidate=true;primary=false;factorybeanname=jmsconfiguration;factorymethodname=sqsconnectionfactory;initmethodname=null;destroymethodname=(推断);在类路径资源[com/foo/configuration/jmsconfiguration.class]中定义]

为什么spring用非主bean替换主bean?我如何让spring使用专门标记为主bean的bean?

编辑:src/main/java配置:

@Configuration
public class JmsConfiguration {

... other bean declarations here ...

@Bean
public SQSConnectionFactory sqsConnectionFactory(Region region) throws JMSException {
    return SQSConnectionFactory.builder()
            .withRegion(region)
            .build();
}
}

测试配置:

@Configuration
public class TestJmsConfiguration {

@Bean(name="messageProducerMock")
public MessageProducer mockMessageProducer() {
    return new MessageProducerMock();
}

... other bean declarations here ...

@Bean
@Primary
public SQSConnectionFactory sqsConnectionFactory(@Qualifier("messageProducerMock") MessageProducer messageProducerMock) throws JMSException {
    ... returning setup mock here
}
}
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = {"test"})

共有1个答案

林博厚
2023-03-14

@primary仅在注入点生效,因为不同的bean与要注入的条件匹配而发生冲突,并且需要做出决定。

bean初始化时不使用@primary。当您使用两种不同的方法创建同一个bean时,Spring认为您正在尝试重写它,因此可能会发生这种行为。给定一个名称是最简单的解决方案,但请记住,您的上下文仍将初始化您不想使用的bean。

 类似资料:
  • 在JavaEE6中,有一个内置的bean类型可供注入,如

  • 我按照本教程在Java中配置Spring批处理作业。它通过使用一个接口为多个数据源做准备,然后由每个数据源实现该接口。 这是我目前所掌握的: PostgreSQLConfig.java jobconfig.java 通过对我的MySQLConfig使用注释,我希望使用MySQLConfig bean。相反,我得到的是:

  • 我的配置如下所示: 在应用程序上下文启动期间,我会在日志中收到如下内容: [INFO][]重写bean“ReconficationJob”的bean定义:替换[Generic bean:class[org.springframework.batch.core.configuration.xml.SimpleFlowFactoryBean];scope=;abstract=false;lazyIni

  • 我已经升级到spring Boot2.1版本,我在启动应用程序时遇到了奇怪的异常。 [O.S.B.W.S.C.AnnotationConfigServletWebServerApplicationContext]上下文初始化期间遇到异常-取消刷新尝试:org.SpringFramework.Beans.Factory.Support.BeanDefinitionOverrideException:

  • 我使用的是Spring4.3.x。 我看过很多相关的帖子,但没有一篇给我答案。如有任何帮助,我们将不胜感激。

  • 对于Spring Boot2.1,默认情况下禁用bean重写,这是一件好事。 然而,我确实有一些测试,其中我使用mockito用模拟实例替换bean。在默认设置下,使用这种配置的测试将由于bean重写而失败。 我发现唯一有效的方法是通过应用程序属性启用bean重写: 但是,我真的希望确保测试配置的bean定义设置最小,这一点将由spring在禁用重写的情况下指出。 我正在重写的bean是 在导入到