【问题标题】:Patterns about bean management in Spring BootSpring Boot 中关于 bean 管理的模式
【发布时间】: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、在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什么都没有 对于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);
    }

}

但我不认为静态字段可以自动装配。

【问题讨论】:

  • 您已经设法消除了足够多的代码,而剩下的代码甚至无效,因此无法准确说出您的要求。如果您反对不同类型的任务需要不同的依赖关系,并且您不想明确地将 DAO 传递给所有任务,那么您可能需要一个抽象工厂。
  • @chrylis 对不起,我没有把我的问题描述清楚,我更新了问题,希望你能理解我。
  • 你仍然不能自动装配方法变量。
  • @chrylis 很抱歉,这是我的错误,我已经更正了。
  • TaskHandlerMap.getHandler() 必须是静态方法吗?如果没有,您可以使用 Spring 创建一个 TaskHandlerMap 实例,其中注入了 DaoService。然后,每当 TaskHandlerMap 创建一个 TaskHandler 时,它就可以将 DaoService 传递给它。

标签: java spring dependency-injection spring-boot


【解决方案1】:

您不需要在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);
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2021-04-26
    • 2021-02-11
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    相关资源
    最近更新 更多