gpt4 book ai didi

java - Spring Boot 中 Bean 管理的模式

转载 作者:太空宇宙 更新时间:2023-11-04 14:26:36 24 4
gpt4 key购买 nike

我有一个 Task 和一个 TaskHandler

处理程序通过DaoService访问数据库。 DaoService 是托管的由 Spring 容器提供,但处理程序由 new 生成,而不是由 Spring 容器管理。

所以我认为我无法通过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设置为处理程序。

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);
}

}

但我不认为静态字段可以 Autowiring 。

最佳答案

您不需要在 TaskHandlerMap 上使用静态方法或字段。相反,如果您将 TaskHandlerMap 声明为 Spring bean,Spring 将确保它有一个实例。然后,您可以让 Spring 将任何依赖项注入(inject)到类中并使用它们来创建映射。

类似这样的事情:

@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);
}
}

关于java - Spring Boot 中 Bean 管理的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26607728/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com