有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Spring中的java服务模式可能更有效地使用状态

因此,我对Spring比较陌生,我试图完全理解服务模式和DAO/实体模式。通常我有实体(对于Hibernate),DAO使用实体实现CRUD,然后是与DAO交互的服务对象(如果我在这一点上错了,请纠正我,这很可能)

我理解服务应该是无状态的,这样它们就可以作为一个单例来实现自动连接和依赖注入。但是,我有一个实例,通过维护状态,可以提高服务的效率

假设我有以下实体(不是我的实际实体):

@Entity
public class entity {
    private int id;
    private String category;
    private String value;
}

我的服务需要提取这些实体,然后对于控制器中的每个端点,我需要查找其类别与“ABC”匹配且其值“X”出现在一个大字符串中的实体。因为我在运行时没有“X”,所以我不能只发出一个请求“其中category='ABC'和value='X'”。相反,我必须提取所有实体“其中category='ABC'”并查看它们的值是否在我的字符串中

到目前为止,我提出了以下解决方案:

  • 让服务在实例化时将所有实体从数据库中拉出,然后当我需要查看我的字符串是否包含类别为“ABC”的任何实体的值时,我搜索列表检查类别,然后查看我的string.contains(entity.value)。这里的缺点是实体是在实例化时设置的,因此,如果在实例化之后数据库发生更新,它将不会获取它们。这也是“有状态的”,所以有点违反了服务的“无状态”规则

  • 每次我需要时,让服务仅拉取类别为“ABC”的实体,然后循环查看结果,查看我的string.contains(entity.value)。这似乎更好,但缺点是我可能需要在同一个端点中对同一个类别进行多次调用,因此我多次提取类别“ABC”的每个实体,导致额外的数据库访问

  • 让服务提供一个方法List<entity> getList(String category)来返回类别为“ABC”的所有实体的列表,然后提供另一个方法entity searchList(List<entity> entities, String str)来检查每个实体是否包含在str中。然后端点可以在执行开始时检索列表,并在每次需要检查时运行searchList。这里的问题是,我觉得这是把太多的责任放在了调用代码来维护这种状态上

  • 扔掉单例模式,实例化一个新对象,用类别“ABC”调用getList一次,这将为每个端点提供一次数据库访问。该对象将保持列表为其状态,并且对searchList的每次调用都将仅迭代我在开始时检索到的列表。这里的缺点是它不能自动连接

如何在不维护状态的情况下在服务中执行类似的操作?我是不是“过度”了?我应该创建一个“非服务”对象来处理这个问题吗?这是原型范围的一个很好的候选者吗


共 (0) 个答案