如何在 Spring MVC 中正确使用 3 层架构 - Java

How to properly use 3 - layers architerchture in Spring MVC - Java

我带着困惑来到你面前,也许你可以向我澄清一下。

我现在正在学习如何通过 Spring MVC 使用 3 层架构(使用存储库、服务、控制器),但我不明白以下内容以及我应该如何做:

-Service Layer,这里,我没看懂,接口里定义的方法应该和JPA给我们的或者那个实体上自定义的一样(产品,例如,带有 getBrand 等方法)或我们应该为每个实体使用什么方法,我们怎么知道要使用什么?

-从找到的示例中观察到的另一件事是,对于 Product 实体,在 Service 中使用了一个新的 class,ProductData,具有我们愿意查看的那些实例,是否可以这样做还是留在我们的实体?如果是,在服务方法中,我们应该使用 ProductData 而不是 Product 实体? 示例:

public ProductData findById(Integer id){
        ProductEntity product = productRepo.findById(id);
        ProductData data = new ProductData(product.getId(), product.getName(), product.getCeva());
        return data;}

-如果我们在服务中使用 ProductData,我们也应该在控制器中使用它,对吗?

-Utility 类 的目的是什么,我们应该何时以及如何使用它们,例如在 MVC 中?

感谢您的耐心和帮助,我一直在搜索 google 这些东西,但我没有找到任何结论,只是个人喜好...

Repository 层负责处理数据库和应用程序之间的通信。在这里您可以加载、保存、删除或更新您的实体。很简单。

服务层负责业务逻辑。在简单的情况下,它看起来像是控制器和存储库之间的代理,但假设您必须加载产品,然后计算每个产品的价格,调用另一个 Web 服务获取产品图片,并将它们放在一起作为响应发送回客户端.

所以这里的正确方法取决于您的要求。

大多数时候(简单示例除外)您必须提供复杂的数据。 因此,您不能只 return 使用简单实体,而是使用组合对象。

另一件事是,如果您 return 使用实体,它会将整个数据库结构返回给客户端(id、审计字段等),这是一个巨大的安全问题。因此,组合对象更安全,并且将来如果需求发生变化,也更容易修改应用程序。

实用类只是帮手。当你有一些通用的逻辑,它不能封装到超类中时,你可以使用它。例如转换日期,检查字符串的可空性和空性..等