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

标签 java spring spring-boot design-patterns

在我的 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/

相关文章:

java - Ebean 和 Play 框架 2.3.8 : Missing statements

java - 如何使用免费工具查找类加载器泄漏?

spring - HTTP 使用 RestTemplate 获取 header

java - 谷歌应用引擎 : What is SystemServiceServlet and its relation to the _ah directory?

java - 所需的请求正文内容缺失 : org. springframework.web.method.HandlerMethod$HandlerMethodParameter

java - 由 : java. lang.ClassNotFoundException : org. elasticsearch.transport.Netty3Plugin 引起

java - WebSecurityConfigurers 上的@Order 必须是唯一的。 org.engine.security.WebSecurityConfig 上已经使用了 100 的顺序

java - 运行时Logback java配置

java - 我有一个关于 java jar 包的问题

java - DdlTransactionIsolatorJtaImpl 无法找到 TransactionManager