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) 个答案