【发布时间】:2014-10-28 11:55:15
【问题描述】:
我有一个Task 和一个TaskHandler。
处理程序通过DaoService 访问数据库。 DaoService 被管理
由 Spring Container 生成,但 handler 由 new 生成,不由 Spring Container 管理。
所以我认为我无法通过Autowired 访问处理程序中的DaoService。
所以我尝试将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);
}
}
但我不认为静态字段可以自动装配。
【问题讨论】:
-
您已经设法消除了足够多的代码,而剩下的代码甚至无效,因此无法准确说出您的要求。如果您反对不同类型的任务需要不同的依赖关系,并且您不想明确地将 DAO 传递给所有任务,那么您可能需要一个抽象工厂。
-
@chrylis 对不起,我没有把我的问题描述清楚,我更新了问题,希望你能理解我。
-
你仍然不能自动装配方法变量。
-
@chrylis 很抱歉,这是我的错误,我已经更正了。
-
TaskHandlerMap.getHandler() 必须是静态方法吗?如果没有,您可以使用 Spring 创建一个 TaskHandlerMap 实例,其中注入了 DaoService。然后,每当 TaskHandlerMap 创建一个 TaskHandler 时,它就可以将 DaoService 传递给它。
标签: java spring dependency-injection spring-boot