我正在尝试使用 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/