我有一个Task
和TaskHandler
。
处理程序通过DaoService
访问DB。 DaoService
被管理
由Spring Container提供,但处理程序由new
生成,而不由Spring Container管理。
所以我想我无法通过DaoService
访问处理程序中的Autowired
。
所以我试图将DaoService
传递给处理程序,但是我不知道如何传递它。
在我目前的工具中:
1,我将DaoService设置为Task。
public Task generateTask(Param param, DaoService dao)
{
Task task = new Task();
task.setDao(dao);
task.setparam(getTaskParam(param));
return task;
}
2,在
Task
的call()
中,将DaoService
设置为handler。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);
}
}
但我认为静态字段无法自动接线。
最佳答案
您无需在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);
}
}