Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java springboot中的bean管理模式_Java_Spring_Dependency Injection_Spring Boot - Fatal编程技术网

Java springboot中的bean管理模式

Java springboot中的bean管理模式,java,spring,dependency-injection,spring-boot,Java,Spring,Dependency Injection,Spring Boot,我有一个任务和一个任务处理者 处理程序通过DaoService访问数据库。服务是被管理的 由Spring容器生成,但处理程序由new生成,而不是由Spring容器管理 所以我想我不能通过自动连线访问处理程序中的DaoService 所以我尝试将DaoService传递给处理程序,但我不知道如何传递它 在我目前的工作中: 1、 我将DaoService设置为任务 public Task generateTask(Param param, DaoService dao) { Task tas

我有一个任务和一个任务处理者

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

所以我想我不能通过自动连线访问处理程序中的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、 在任务的调用中,我将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);
    }
}
我的问题是:

1、 任务不应包含名为DaoService的成员,任务没有任何内容 对于DaoService,Task应该只关注TaskHandler

2、 DaoService不应传递给generateTasks。一项任务可以是 即使没有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);
    }

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

但是我认为静态字段不能自动连接。

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

大概是这样的:

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

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

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