2014-10-28 51 views
1

我有一個TaskTaskHandlerSpring Boot中Bean管理的模式

處理程序訪問數據庫通過DaoServiceDaoService由Spring Container管理 ,但處理程序由new生成,並且不由Spring Container管理。

所以我認爲我不能通過Autowired訪問處理器中的DaoService

所以我試圖通過DaoService處理程序。但我不知道如何通過它。

在我目前的工具:

1,我的DaoService設置爲一個任務。

public Task generateTask(Param param, DaoService dao) 
{ 
    Task task = new Task(); 
    task.setDao(dao); 
    task.setparam(getTaskParam(param)); 
    return task; 
} 

2,在Taskcall(),我設置DaoService到處理程序。

class Task implements Callable<Boolean> 
{ 
    DaoService dao; 
    // getter and setter 
    public boolean call() 
    { 
     TaskHandler handler = TaskHandlerMap.getHandler(); 
     handler.setDaoService(dao); 
     return handler.process(param); 
    } 
} 

3,最後,我在我的main()我所說的generateTask()來獲取任務。

class MainClass() 
{ 
    @Autowired 
    DaoService dao; 

    Param param = new Param(); 

    public static void main(String[] args) 
    { 
     Task task = generateTasks(param, dao); 
     // submit the task to thread pool. 
    } 
} 

我的問題是:

1,Task不應該包含一個成員叫DaoServiceTask無關 做DaoServiceTask應該只對TaskHandler擔憂。

2,DaoService不應傳遞給generateTasks()。一個Task可以是 創建即使沒有DaoService

如何避免這種情況?或者一些很好的建議?

任何幫助將不勝感激。

更新時間:

據@AndyWilkinson建議,代碼可能是這樣的:

class TaskHandlerMap 
{ 
    @Autowired 
    private static XXXHandler xxxHandler; 

    private static Map<String,AbstractItemHandler> map = Maps.newHashMap(); 

    static 
    { 
     map.put(Constants.XXX_PATH, xxxHandler); 
    } 


    public static AbstractItemHandler get(String key) 
    { 
     return map.get(key); 
    } 

} 

但我不認爲靜態字段可以自動裝配。

+0

你已經成功地消除夠了你的代碼,這就是剩下的甚至不是有效的,所以這是不可能告訴你問什麼。如果您的反對意見是不同類型的任務需要不同的依賴關係,並且您不希望將DAO顯式傳遞給所有任務,那麼您可能需要抽象工廠。 – chrylis 2014-10-28 12:01:34

+0

@chrylis對不起,我沒有清楚描述我的問題,我更新了這個問題,希望你能理解我。 – NingLee 2014-10-28 12:44:28

+1

您仍然無法自動連接方法變量。 – chrylis 2014-10-28 12:48:52

回答

0

您不需要在TaskHandlerMap上使用靜態方法或字段。相反,如果你將TaskHandlerMap聲明爲Spring bean,Spring將確保它有一個實例。然後您可以讓Spring將任何依賴關係注入到類中並使用它們來創建地圖。

事情是這樣的:

@Component 
class TaskHandlerMap { 

    private final Map<String, AbstractItemHandler> handlerMap = Maps.newHashMap(); 

    @Autowired 
    TaskHandlerMap(XXXHandler handler) { 
     handlerMap.put(Constants.XXX_PATH, handler); 
    } 

    public AbstractItemHandler get(String key) { 
     return handlerMap.get(key); 
    } 
}