破解Spring @Profile逻辑

时间:2018-01-08 11:55:42

标签: java spring-boot

我正在使用新的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?

如果没有,我在这里做错了什么?

2 个答案:

答案 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注释整个班级,对我来说它是可读的