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