巧用@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

相关推荐
lingRJ77716 小时前
从混沌到掌控:基于OpenTelemetry与Prometheus构建分布式调用链监控告警体系
java·springboot·prometheus·backend·opentelemetry·jaeger·microservices
endswel1 天前
Spring MVC HandlerInterceptor 拦截请求及响应体
springmvc·springboot
保持学习ing3 天前
苍穹外卖day3--公共字段填充+新增菜品
java·阿里云·实战·springboot·前后端·外卖项目·阿里云文件存储
默默coding的程序猿4 天前
3.前端和后端参数不一致,后端接不到数据的解决方案
java·前端·spring·ssm·springboot·idea·springcloud
衍生星球5 天前
Maven 3.9.6的下载和配置
java·maven·springboot
还是鼠鼠15 天前
日志技术-Logback入门程序
java·后端·spring·springboot·logback
starstarzz18 天前
解决idea无法正常加载lombok包
java·ide·spring·intellij-idea·springboot·web
vivo互联网技术20 天前
Spring Boot 启动优化实践
后端·springboot·spring启动加速·异步初始化
七烦22 天前
vue3 + springboot实现微信登录
vue·springboot·微信公众号
LUCIAZZZ23 天前
项目拓展-Apache对象池,对象池思想结合ThreadLocal复用日志对象
java·jvm·数据库·spring·apache·springboot