Java 是否有一种设计模式支持多个抽象类实现的注入,并有条件地使用其中一个注入的bean

Java 是否有一种设计模式支持多个抽象类实现的注入,并有条件地使用其中一个注入的bean,java,spring-boot,Java,Spring Boot,我参与了一个使用Java和Spring引导的项目,该项目处理来自同一队列的几种不同消息类型。根据消息类型有条件地处理每个消息,为每个消息类型使用MessageProcessingService抽象类的实现 到目前为止,我们有5种不同的消息类型进入同一消费者。我们使用相同的队列,因为我们利用JMS中的组策略,并且每种消息类型都具有与组策略相同的业务密钥 因此,我们最终得到的是,每当一个需求需要接收一个新的消息类型时,我们都会向consumer对象添加一个MessageProcessingServi

我参与了一个使用Java和Spring引导的项目,该项目处理来自同一队列的几种不同消息类型。根据消息类型有条件地处理每个消息,为每个消息类型使用
MessageProcessingService
抽象类的实现

到目前为止,我们有5种不同的消息类型进入同一消费者。我们使用相同的队列,因为我们利用JMS中的组策略,并且每种消息类型都具有与组策略相同的业务密钥

因此,我们最终得到的是,每当一个需求需要接收一个新的消息类型时,我们都会向consumer对象添加一个
MessageProcessingService
的新实现和另一个依赖项。我想找到一个更好的策略来选择性地选择消息处理

这里有一个与我们正在做的类似的例子。我不保证语法是可编译的,也不保证语法是完美的,只是演示了这个问题。请注意,围绕一个人的所有消息

消费者:

@组件
公共类PersonMessageConsumer{
私有消息处理服务高度更新消息处理服务;
私有消息处理服务权重更新消息处理服务;
私有消息处理服务名称更新消息处理服务;
私有消息处理服务shoeSizeUpdateMessageProcessingService;
公众人物信息消费者(
MessageProcessingService高度更新MessageProcessingService,
MessageProcessingService权重更新MessageProcessingService,
MessageProcessingService名称更新MessageProcessingService,
MessageProcessingService shoeSizeUpdateMessageProcessingService){
this.heightUpdateMessageProcessingService=heightUpdateMessageProcessingService;
this.weightUpdateMessageProcessingService=weightUpdateMessageProcessingService;
this.nameUpdateMessageProcessingService=nameUpdateMessageProcessingService;
this.shoeSizeUpdateMessageProcessingService=shoeSizeUpdateMessageProcessingService;
}
@JmsListener(destination=“${queueName}”)
公共无效接收消息(文本消息消息){
字符串messageType=message.getHeader(“messageType”);
开关(消息类型){
案例“高度更新”:
heightUpdateMessageProcessingService.processMessage(message.getText());
返回;
案例“权重更新”:
weightUpdateMessageProcessingService.processMessage(message.getText());
返回;
//和其他消息类型
违约:
抛出新的未知消息类型异常(messageType);
}
}
消息POJO示例

公共类HeightUpdate实现PersonMessage{
@吸气剂
@塞特
私人内部高度;
}
PersonMessage接口

公共接口PersonMessage{
int getPersonId();
}
消息处理服务

公共抽象类MessageProcessingService{
public void processMessage(字符串messageText){
//常见的消息处理,我们在这里做一些更复杂的工作,但只是作为一个简单的例子
T message=newObjectMapper.readValue(messageText,getClassType());
Person=personRepository.load(message.getPersonId());
Person originalPerson=Person.deepCopy();
processMessageLogic(个人、消息);
如果(originalPerson.isDifferentFrom(person)){
personRespository.update(person);
} 
}
受保护的抽象无效processMessageLogic(Person,T message);
受保护的抽象类getClassType();
}
抽象类实现示例

@Service(“heightUpdateMessageProcessingService”)
公共类HeightUpdateMessageProcessingService扩展MessageProcessingService{
@凌驾
受保护的void processMessageLogic(个人、高度更新){
person.setHeight(update.getHeight());
}
@凌驾
受保护的类getMessageType(){
返回HeightUpdate.getClass();
}
}
所以我的问题是,是否有一种更好的设计模式或在java和spring中编写代码的方法更易于清理和维护,并且牢记坚实的原则

  • MessageProcessingService
    中添加一个抽象方法,以返回每个具体实现可以处理的
    messageType
  • 不要将每个单独的服务连接到
    PersonMessageConsumer
    ,而是连接到
    列表中
    ,以便一次获得所有服务
  • 使用
    消息类型
    作为键,将
    列表
    转换为
    映射
  • 通过在
    Map
    中查找适当的服务,然后调用其
    processMessage
    方法,替换
    switch
    语句
  • 将来,您可以添加
    MessageProcessingService
    的新实例,而无需编辑
    PersonMessageConsumer
    ,因为Spring会自动将这些新实例添加到您连接的
    列表中

  • MessageProcessingService
    中添加一个抽象方法,以返回每个具体实现可以处理的
    messageType
  • 不要将每个单独的服务连接到
    PersonMessageConsumer
    ,而是连接到
    列表中
    ,以便一次获得所有服务
  • 使用
    消息类型
    作为键,将
    列表
    转换为
    映射
  • 通过在
    Map
    中查找适当的服务,然后调用其
    processMessage
    方法,替换
    switch
    语句
  • 将来,您可以添加
    MessageProcessingService
    的新实例,而无需编辑
    PersonMessageConsumer
    ,因为Spring会自动将这些新实例添加到您连接的
    列表中