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

相关推荐
坐吃山猪10 小时前
WebClient内存配置解析
开发语言·springboot·webflux
Pocker_Spades_A17 小时前
飞算JavaAI 48分钟能做完Java全栈项目吗?
java·springboot·#ai编程·#飞算javaai·#java代码生成·#aicoding模型·#java开发
孔明click3318 小时前
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
java·sa-token·开源·springboot·权限认证
云边有个稻草人2 天前
飞算JavaAI能处理SaaS套餐变更业务吗?
java·springboot·ai编程·java开发·飞算javaai·java代码生成·ai coding模型
todoitbo2 天前
飞算JavaAI的多租户权限隔离实测
java·springboot·ai编程·java开发·飞算javaai·java代码生成
闲猫2 天前
Docker本地用Dockfile 构建Java后端SprintBoot镜像
docker·springboot·dockerfile
Kings993 天前
AI 请求参数智能生成与一键调试方法支持,Fast Request重磅发布
ai·springboot·idea插件
小小啊python5 天前
IDEA中SpringBoot项目配置热部署
java·ide·intellij-idea·springboot·热部署
glustful6 天前
企业内部审计项目管理 系统开源(springboot+vue3)
vue3·springboot
还是鼠鼠12 天前
Spring AI ChatClient详解:创建第一个AI客户端
java·springboot·spring ai·chatclient