我有一个TaskTaskHandler

处理程序通过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,在Taskcall()中,将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);
    }
}

07-24 22:13