我正在使用新的Spring Boot 2.0M7,我正在尝试定义一些条件逻辑来根据活动配置文件加载不同的bean。
我有这个(工作)bean配置。这为除test和activemq之外的所有环境定义了基于sqs的连接工厂。
@Configuration
@EnableJms
public class QueueConfig {
private static Logger LOG = LoggerFactory.getLogger(QueueConfig.class);
@Profile({"!test"})
@Bean
public ConnectionFactory sqsConnectionFactory() {
LOG.info("using sqs");
return new SQSConnectionFactory(new ProviderConfiguration(), AmazonSQSClientBuilder.standard()
.withRegion(Regions.EU_WEST_1)
.withCredentials(new DefaultAWSCredentialsProviderChain())
);
}
@Profile({"test"})
@Bean
public ConnectionFactory activeMqConnectionFactory() {
LOG.info("using activemq");
return new ActiveMQConnectionFactory("vm://localhost?broker.persistent=false");
}
@Bean
public JmsTemplate defaultJmsTemplate(ConnectionFactory connectionFactory) {
return new JmsTemplate(connectionFactory);
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setDestinationResolver(new DynamicDestinationResolver());
factory.setConcurrency("3-10");
return factory;
}
}
这适用于单个配置文件。我可以在我的测试中看到(使用@ActiveProfiles("test")
注释,测试配置文件处于活动状态并且正确的bean加载(日志消息)。
然而,将@Profile({"!test"})
上的@Profile({"!test","!dev})
更改为sqsConnectionFactory
以及@Profile({"test"})
上的@Profile({"test","dev})
更改为activeMqConnectionFactory
会破坏事情。
我得到一个未解决的bean异常,因为它现在有两个实例而不是1.我可以在我的日志中看到测试配置文件仍然处于活动状态,尽管如此它很快就会加载sqs和activemq实现,即使它不应该是#39 ;吨
春季启动2.x中的@Profile逻辑是否有所改变?如果是这样, 如何定义当dev或测试配置文件处于活动状态时使用activemq实现,否则使用sqs?
如果没有,我在这里做错了什么?
答案 0 :(得分:1)
有很多方法可以解决这个问题。这是一个:
创建另一个个人资料mapped.forEach(System.out::println);
。用它来启用或禁用bean。
sqs
然后将配置文件中的配置文件声明为使用此配置文件:
@Profile({"sqs"})
@Bean
public ConnectionFactory sqsConnectionFactory() { ... }
@Profile({"!sqs"})
@Bean
public ConnectionFactory activeMqConnectionFactory() { ... }
答案 1 :(得分:1)
@Profile({"!test","!dev})
- 在"
之后你遗漏了一个!dev
,但是,如果这里只是一个拼写错误,请尝试关注(对我有效)
@Profile(value={"!test", "!dev"})
和btw - 我个人更喜欢每个班级有一个@Bean
个配置,在这种情况下,你基本上用@Profile
注释整个班级,对我来说它是可读的