使用@ConditionalOnProperty选择性注册Bean

106 阅读1分钟

需求

批量发送短信业务,对于消息中间件,用户可以选择使用kafka或者rabbitmq,我们不知道用户最终会选择什么,所以在开发环境中,需要一种配置可以方便切换两种不同的中间件进行测试。这就是@ConditionalOnProperty注解所擅长的工作。

使用举例

配置文件

# 可选 rabbit
tomla.mq.config=kafka

常量类

public class MqConstant {
    public static final String KAFKA = "kafka";
    public static final String RABBIT = "rabbit";
}

创建发送消息的接口

public interface MqService {
    //代码略
}

创建接口的两种实现类(rabbit和kafka)

@Service
@ConditionalOnProperty(name = "tomla.mq.config", havingValue = MqConstant.KAFKA)
public class KafkaMqServiceImpl implements MqService {
  //代码略
}
@Service
@ConditionalOnProperty(name = "tomla.mq.config", havingValue = MqConstant.RABBIT)
public class RabbitMqServiceImpl implements MqService {
  //代码略
}

注解@ConditionalOnProperty中的name对应配置文件中tomla.mq.confighavingValue的值与配置文件中tomla.mq.config的value相同时,注解所在的bean才会被启用。比如想要使用rabbit,修改配置文件为:tomla.mq.config=rabbit即可。

参考:www.baeldung.com/spring-cond…