2013-10-03 49 views
0

我有以下類別:春天 - 動態廠基於枚舉

public enum TaskType { 

    VERIFY_X_TASK, COMPUTE_Y_TASK, PROCESS_Z_TASK; 
} 

public interface Task{ 
    void process(); 
} 

@Component 
public class VerifyXTask implements Task{ 
    // Similar classes for the other types of tasks 
    public void process() { 
    } 
} 

@Component 
public class TaskFactory{ 
    private Map<TaskType, Task> tasks; 
    public Task getTask(TaskType type){ 
     return tasks.get(type); // return a singleton with all it's fields injected by the application context 
    } 
} 

class UseTool{ 
    @Autowired 
    private TaskFactory taskFactory; 

    public void run(String taskType){ 
     Task task = taskFactory.getTask(TaskType.valueOf(taskType)); 
     task.process(); 
    } 
} 

什麼是注射任務類型和任務之間的關係進廠的最優雅的方式? 考慮到幾乎有100個任務類型,並且這些可能會頻繁更改。

- 進一步解釋: 我可以在TaskFactory類水木清華不喜歡:

tasks.put(TaskType.VERIFY_X_TASK, new VerifyTask()); 
tasks.put(TaskType.COMPUTE_Y_TASK, new ComputeTask()); 
tasks.put(TaskType.PROCESS_Z_TASK, new ProcessTask()); 

但這並不注入在任務對象中的任何屬性。

+0

這並不完全清楚你想要做什麼;爲什麼你有一個'enum'這是一個操作列表,然後'enum'值和實現類之間沒有任何關係? – chrylis

+0

問題是如何映射這種關係。我可以在工廠做類似tasks.put(VERIFY_X_TASK,new VerifyTask());等等,但新的操作符不會注入VerifyTasks依賴項。 –

回答

2

我建議以下方法:

  1. 定義一個定製的註解@ImplementsTask採用一個TaskType作爲參數,這樣你可以寫你的實現類是這樣的:

    @Component 
    @ImplementsTask(TaskType.VERIFY_X_TASK) 
    public class VerifyXTask implements Task { 
    ... 
    

    (或者,您可以批註@Component以避免必須在所有課程中使用它。)

  2. I nject所有識別Task對象放入工廠:

    @Autowired 
    private Set<Task> scannedTasks; 
    
  3. 在關於工廠@PostConstruct方法,迭代每個scannedTasks元件,讀出註釋值並添加Map條目(到EnumMap,當然)。您需要決定如何處理給定TaskType的重複實現。

這將需要一些在工廠設置反射的工作,但它意味着你可以只標註一個Task實施恰當的值,並讓它在掃描無需由實現任何額外的工作。

+0

非常優雅的解決方案。謝謝。 –