gpt4 book ai didi

java - 根据枚举参数选择 Spring bean

转载 作者:行者123 更新时间:2023-11-30 10:05:51 25 4
gpt4 key购买 nike

在我的 Spring Boot 应用程序中,我有一个 Stage 和处理 StageStageProcessor 的概念。 Stage 有一个 StageType 枚举属性。我有不同的 StageProcessor 接口(interface)实现,这些实现是 Spring bean。现在,我有另一个 Spring bean,WorkflowProcessor,它需要根据 StageStageType 调用适当的 StageProcessor .到目前为止,我已经想出了以下内容:

@Service
public class StageConfig {
@Autowired
private StageProcessorA stageProcessorA;
@Autowired
private StageProcessorB stageProcessorB;

public StageProcessor getProcessor(Stage stage) {
switch(stage.getType()) {
case A:
return stageProcessorA;
break;
case B:
return stageProcessorB;
break;
}
}
}

我想知道我是否缺少任何设计模式或 Spring 机制。有更好设计的想法吗?

最佳答案

这在一定程度上取决于您案例的具体情况。在许多情况下,阶段实际上并没有像在枚举中那样进行硬编码,而是可以针对各种系统进行配置。此外,您拥有的潜在阶段越多,设置稍微冗长但避免重复的返回就越大。

总的来说,我会在这里推荐Spring的解析器模式。代码看起来像这样,其中 KeyType 通常是枚举或字符串。一般的想法是每个实现都会告诉您它可以处理什么样的事情(阶段、类型、参数等),然后您查找匹配项。 (没有直接映射查找的变体是有一个 boolean canHandle(something) 并迭代直到找到一个。)

interface StageProcessor {
OutputType process(Stage stage);
KeyType stageKey();
}

@Service
class StageProcessors {
Map<KeyType, StageProcessor> stageProcessors;

StageProcessors(Collection<StageProcessor> processors) {
stageProcessors = processors.stream().collect(groupingBy(StageProcessor::stageKey));
assert stageProcessors.size() == expectedNumberOfProcessors;
}

StageProcessor getProcessor(KeyType stage) {
// although usually your service would take care of dispatching directly
return stageProcessors.get(stage);
}
}

(作为注释:Avoid field injection.)

关于java - 根据枚举参数选择 Spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55007690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com