巧用@Conditional注解根据配置文件注入不同的bean对象

项目中使用了mq,kafka两种消息队列进行发送数据,为了避免硬编码,在项目中通过不同的配置文件自动识别具体消息队列策略。这里整理两种实施方案,仅供参考!

方案一:创建一个工具类,然后根据配置文件来返回具体的IBase实现类

1.IBaseService

java 复制代码
/**
 * 发送数据接口
 */
public interface IBaseService {
    void send();
}

2.KafkaServiceImpl

java 复制代码
@Service
public class KafkaServiceImpl implements IBaseService {
    @Autowired
    MyConfiguration myConfiguration;

    @Override
    public void send() {
        System.out.println("调用Kafka接口发送数据!");
        myConfiguration.init("-------------Kafka-------------");
    }
}

3.MQServiceImpl

java 复制代码
@Service
public class MQServiceImpl implements IBaseService {
    @Autowired
    MyConfiguration myConfiguration;

    @Override
    public void send() {
        System.out.println("调用MQ接口,发送数据!");
        myConfiguration.init("-------------MQ-----------");
    }
}

4.SendMessageUtil

java 复制代码
/**
 * 根据不同配置文件,选择发送消息工具类
 */
@Component
public class SendMessageUtil {
    //message.type在application.yaml,":kafka" 设置默认值为kafka
    @Value("${message.type:kafka}")
    private String type;

    @Autowired
    KafkaServiceImpl kafkaService;
    @Autowired
    MQServiceImpl mqService;

    public IBaseService get(){
        if (type.equals("kafka"))
            return kafkaService;
        else
            return mqService;
    }
}

5.方案一单元测试及测试结果

application.yaml

yaml 复制代码
message:
  type: kafka
java 复制代码
	@Autowired
	SendMessageUtil sendMessageUtil;
	@Test
	void contextLoadsTwo() {
		IBaseService tempBaseService = sendMessageUtil.get();
		tempBaseService.send();
	}

方案二:@Conditional注解根据配置文件注入不同的bean对象

1.KafkaCondition

java 复制代码
/**
 * Kafka推送方式
 */
public class KafkaCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        String type = environment.getProperty("message.type");
        if (type.contains("kafka")){
            return true;
        }
        return false;
    }
}

2.KafkaServiceImpl上面加上@Conditional(KafkaCondition.class)

3.MQCondition

java 复制代码
/**
 * MQ推送方式
 */
public class MQCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        String type = environment.getProperty("message.type");
        if (type.contains("mq")){
            return true;
        }
        return false;
    }
}

4.MQServiceImpl上面加上@Conditional(MQCondition.class)

5.方案二单元测试及测试结果

application.yaml

yaml 复制代码
message:
  type: kafka
java 复制代码
// 注意:运行contextLoadsTwo测试方法时候,需要将iBaseService全部注释掉,否则会报错
	// 也要将KafkaServiceImpl和MQServiceImpl上面@Conditional注释掉
	@Autowired
	SendMessageUtil sendMessageUtil;
	@Test
	void contextLoadsTwo() {
		IBaseService tempBaseService = sendMessageUtil.get();
		tempBaseService.send();
	}

6.项目结构及源码

源码奉上,欢迎star!
MyIdea

相关推荐
飞天小牛肉2 天前
拼多多面经,暑期实习Java一面
java·spring·springboot·秋招·校招
橘猫云计算机设计2 天前
django基于爬虫的网络新闻分析系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
后端·爬虫·python·django·毕业设计·springboot
南客先生2 天前
海量聊天数据处理:基于Spring Boot与SharingJDBC的分库分表策略及ClickHouse冷热数据分离
mysql·clickhouse·springboot·分库分表·大数据处理·sharingjdbc
shangxianjiao5 天前
Javaweb后端 maven高级 maven聚合
java·maven·springboot·springcloud·聚合
缘友一世5 天前
充电宝项目中的MQTT(轻量高效的物联网通信协议)
物联网·springboot
遇见你真好。6 天前
递归获取部门数方法
java·springboot
来自星星的坤6 天前
SpringBoot 与 Vue3 实现前后端互联全解析
后端·ajax·前端框架·vue·springboot
计算机学姐7 天前
基于SpringBoo的地方美食分享网站
java·vue.js·mysql·tomcat·mybatis·springboot·美食
想念泡凤爪的味道8 天前
基于Redission实现分布式调度任务选主
redis·spring cloud·springboot
有什么东东8 天前
山东大学软件学院创新项目实训开发日志(12)之将对话记录保存到数据库中
java·数据库·vue·springboot