Java 如何在Spring Boot中正确创建非持久性存储库?

Java 如何在Spring Boot中正确创建非持久性存储库?,java,spring,spring-boot,Java,Spring,Spring Boot,我想将资源数据存储在Spring Boot RESTful web服务的内存中(例如,在映射中,非持久性)。我对Spring(Boot)还不熟悉,我不确定做这件事的首选方法是什么 创建包含资源的存储库(@Repository)是正确的方法,还是首选创建服务、组件或使用其他方法 假设我希望TODO具有多对多关系和标签,如下所示: @RestController @请求映射(“/todos”) 公共类TodoController{ @自动连线 私人储蓄存款存款存款存款存款存款存款存款存款存款存款存款

我想将资源数据存储在Spring Boot RESTful web服务的内存中(例如,在映射中,非持久性)。我对Spring(Boot)还不熟悉,我不确定做这件事的首选方法是什么

创建包含资源的存储库(
@Repository
)是正确的方法,还是首选创建服务、组件或使用其他方法

假设我希望TODO具有多对多关系和标签,如下所示:

@RestController
@请求映射(“/todos”)
公共类TodoController{
@自动连线
私人储蓄存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款存款;
@自动连线
私有标记库标记库;
...
}

重建控制器类中的关系可以吗?这是否应该发生在中间的TodoService类中?

存储库与JDBC(或JPS等)一起使用,以帮助您与DB(持久的,如SQL,或内存中的,如H2)通信。如果不这样做,则不需要存储库接口

如果您非永久性地存储信息并希望能够将其注入,我会将该
Map
作为instancee变量放入服务类中。然后,您可以在任何地方插入服务并访问
Map


我更喜欢的模式是将服务注入控制器,除了对服务层的调用和
HTTPResponse
的构造之外,控制器中的服务很少,并将所有逻辑都放入服务中。(我会将存储库插入到服务中以处理任何DB交互,但在您的情况下,这些服务方法将与您的map实例变量交互)/

存储库与JDBC(或JPS等)一起使用,以帮助您与DB(持久的,如SQL,或内存中的,如H2)通信。如果不这样做,则不需要存储库接口

如果您非永久性地存储信息并希望能够将其注入,我会将该
Map
作为instancee变量放入服务类中。然后,您可以在任何地方插入服务并访问
Map


我更喜欢的模式是将服务注入控制器,除了对服务层的调用和
HTTPResponse
的构造之外,控制器中的服务很少,并将所有逻辑都放入服务中。(我会将存储库/IE注入到服务中以处理任何DB交互,但在您的情况下,这些服务方法将与您的map实例变量交互)/

我对此的看法非常简单

如果您使用的是一个基本的CRUD应用程序,没有太多的知识,只是一种与数据库交互的方式,那么您实际上不需要依赖
服务
,是的,从
控制器
存储库
具有依赖性是很好的

让我们举一个例子:当您向数据库添加一个新的Todo时,是否总是创建一个新标记?如果是,那么这两个实体可能是链接在一起的,应该通过一种中心方式,即服务来处理。这样,您可以确保创建Todo的人员也将创建关联的标记。但如果这两个实体没有共同之处,那么将它们分开就可以了

关于你的其他问题,
Repository
这件事。你可以很容易地把你的想法写成代码。在春季,如果您查看注释
@Repository
的代码,您将看到它只不过是一个
@组件
。术语
Repository
仅用于帮助您和您的团队通过轻松识别每个类的角色来理解代码库。根据定义,
Repository
是对域对象的访问,在您的例子中是
Todo
。无论其背后的持久性系统是什么,这只是对域对象的访问

下面是一个你可以做到这一点的例子

public interface TodoRepository {
    int save(Todo todo);

    Todo findById(int totoId);
}

@Repository
public class InMemoryTodoRepository implements TodoRepository {
    private Map<int, Todo> todos = new HashMap<>();

    public Todo save(Todo todo) {
        int newId = // generate new Id;
        todos.put(newId, todo)
        return newId;
    }

    public Todo findById(int totoId) {
        return todos.get(todoId);
    }
}

存储库的公共接口{
int保存(Todo Todo);
Todo findById(整数totoId);
}
@存储库
MemoryToDepository中的公共类实现了ToToDepository{
私有映射todos=newhashmap();
公共待办事项保存(待办事项){
int newId=//生成新Id;
todo.put(新ID,todo)
返回newId;
}
公共Todo findById(整数TOTOTOID){
返回todos.get(todoId);
}
}

这样,当您想将InMemorySystem更改为一个我不知道是什么的数据库时,您只需创建一个实现该接口的新类,就可以了,即低耦合,我的观点非常简单

如果您使用的是一个基本的CRUD应用程序,没有太多的知识,只是一种与数据库交互的方式,那么您实际上不需要依赖
服务
,是的,从
控制器
存储库
具有依赖性是很好的

让我们举一个例子:当您向数据库添加一个新的Todo时,是否总是创建一个新标记?如果是,那么这两个实体可能是链接在一起的,应该通过一种中心方式,即服务来处理。这样,您可以确保创建Todo的人员也将创建关联的标记。但如果这两个实体没有共同之处,那么将它们分开就可以了

关于你的其他问题,
Repository
这件事。你可以很容易地把你的想法写成代码。在春季,如果您查看注释
@Repository
的代码,您将看到它只不过是一个
@组件
。术语
Repository
仅用于帮助您和您的团队通过轻松识别每个类的角色来理解代码库。根据定义,
Repository
是对域对象的访问,在您的例子中是
Todo
。无论其背后的持久性系统是什么,这只是对域对象的访问

<