java - Spring中是否可以使用枚举来实现策略模式

标签 java spring spring-boot enums

我正在尝试使用 Enum 实现策略模式,但我需要服务来处理我的每项任务。我尝试将服务 @Autowired 到 Enum 中,但它不起作用。 我搜索了一些“如何将 bean 注入(inject)枚举”,出现了 answer (但它对我来说看起来不太优雅)。

我现在犹豫是否继续,因为我不知道这是否是一个好方法。我们有针对这种需求的更好的设计吗?

public enum TaskType {

    CREATE_MATERIAL{
        @Override
        public void handleTask(ScheduledEvent scheduledEvent) {
            service.createMaterial(scheduledEvent);
        }
    };


    @Autowired
    private static AService service;

    public abstract void handleTask(ScheduledEvent scheduledEvent);
}

最佳答案

您无法 Autowiring 枚举,因为枚举是由 Java 运行时创建的常量,因此不能是 Spring 管理的 bean。

您需要将任何必需的值作为参数传递给该方法。

public enum TaskType {

    CREATE_MATERIAL{
        @Override
        public void handleTask(AService service, ScheduledEvent scheduledEvent) {
            service.createMaterial(scheduledEvent);
        }
    };

    public abstract void handleTask(AService service, ScheduledEvent scheduledEvent);
}

如果不同的策略需要调用不同的服务,请停止使用enum

public interface TaskType {
    public abstract void handleTask(AService service, ScheduledEvent scheduledEvent);
}

@Component
public class CreateMaterial implements TaskType {

    @Autowired
    private static AService service;

    @Override
    public void handleTask(ScheduledEvent scheduledEvent) {
        service.createMaterial(scheduledEvent);
    }
};

关于java - Spring中是否可以使用枚举来实现策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55204279/

相关文章:

java - 如何处理与微服务无关的类对象?

Java - 在滚动文本中插入换行符

java - 您可以限制特定的 Android API 版本从 googlePlay 商店运行/下载应用程序吗?

java - 静态变量的生命周期是多少

java - Hibernate:Criteria 和 createSQLQuery:如何获取正确的 JSON?

spring - Hibernate、iBatis、Spring JDBC Template,该用哪个?

java - 在执行 POST 请求时,如何将子项保存在现有父项中?

java - 使用 JPA 中的 LocalDateTime 列类型在 MariaDB 中创建 DATETIME

java - mvn install 在 eclipse 中不起作用,但在命令行中工作正常

java - redis.clients.jedis.exceptions.JedisConnectionException : Could not get a resource from the pool