2014-10-28 49 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); 
    } 
}