我有一个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