所以我对Spring来说相对较新,我试图完全理解服务模式和DAO /实体模式。一般来说,我有实体(用于Hibernate),DAO使用实体实现CRUD,然后是与DAO交互的服务对象(纠正我,如果我在这一点上错了,那就非常可能的)。
我知道服务应该是无状态的,因此可以将它们实现为自动装配和依赖注入的单例。但是,我有一个实例,通过维护状态可以提高服务效率。
我们说我有以下实体(不是我的实体):
@Entity
public class entity {
private int id;
private String category;
private String value;
}
我的服务需要提取这些实体,然后对于我的控制器中的每个端点,我需要寻找一个类别匹配的实体" ABC"及其价值" X"发生在一个大字符串中。因为我没有" X"在运行时,我不能发出请求"其中category =' ABC'和价值=' X'"。相反,我必须拉出所有实体"其中category =' ABC'"并查看它们的值是否在我的字符串中。
到目前为止,我已经提出了以下解决方案:
让服务在实例化时将所有实体从数据库中拉出来,然后当我需要查看我的字符串是否包含类别为" ABC&的任何实体的值时#34; ,我搜索列表检查类别,然后查看我的string.contains(entity.value)
。这里的缺点是实体设置为实例化,因此如果在实例化后数据库发生更新,它将无法获取它们。这也是“有状态的”,所以有点打破服务"无国籍"规则。
让服务提取仅类别" ABC"每次我需要它们,然后遍历结果,看看我的string.contains(entity.value)
。这似乎更好,但这里的缺点是我可能需要在同一个端点对同一类别进行多次调用,因此我将每个实体拉为类别" ABC"多次,导致额外的数据库访问。
让服务提供方法List<entity> getList(String category)
以返回包含类别&#34; ABC&#34;的所有实体的列表,然后返回检查每个实体以查看的另一个方法entity searchList(List<entity> entities, String str)
如果它包含在str中然后,端点可以在执行开始时检索List,并在每次需要检查时运行searchList
。这里的问题是我觉得这对维持该状态的调用代码负有太多责任。
抛出单例模式并实例化一个新对象并使用类别&#34; ABC&#34;来调用getList
一次。这将给我每个端点一个数据库旅行。该对象将列表保持为其状态,并且对searchList
的每次调用将仅在我在开头检索的列表上进行迭代。这里的缺点是它无法自动装配。
如何在不维护状态的情况下在服务中执行类似的操作?我是&#34;过度模式化&#34;它?我应该做一个&#34;非服务&#34;对象来处理这个?这是原型范围的良好候选者吗?