我有一個Task
和TaskHandler
。Spring Boot中Bean管理的模式
處理程序訪問數據庫通過DaoService
。 DaoService
由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,在Task
的call()
,我設置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
不應該包含一個成員叫DaoService
,Task
無關 做DaoService
,Task
應該只對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);
}
}
但我不認爲靜態字段可以自動裝配。
你已經成功地消除夠了你的代碼,這就是剩下的甚至不是有效的,所以這是不可能告訴你問什麼。如果您的反對意見是不同類型的任務需要不同的依賴關係,並且您不希望將DAO顯式傳遞給所有任務,那麼您可能需要抽象工廠。 – chrylis 2014-10-28 12:01:34
@chrylis對不起,我沒有清楚描述我的問題,我更新了這個問題,希望你能理解我。 – NingLee 2014-10-28 12:44:28
您仍然無法自動連接方法變量。 – chrylis 2014-10-28 12:48:52