【问题标题】:Spring Boot REST architectureSpring Boot REST 架构
【发布时间】:2018-05-12 07:48:22
【问题描述】:

最近我一直在使用 Angular 5 前端开发一个 Spring Boot 应用程序,我对它的架构有点困惑。我被教导在春季编写存储库、服务和控制器,并遵循 MVC 模式。我开始为应用程序编写文档并尝试描述架构。所以我认为 View 是 Angular 应用程序,C 由控制器类组成,我将第三层描述为由实体和服务类组成的业务逻辑。但模型到底是什么?我是否设法遵循 MVC 模式?此外,我还有一个 controlleradvice、异常类和安全类,它们使用 jwts 进行身份验证和授权,但我猜这些类完全远离 MVC。

我已经搜索了解释,但似乎没有找到。有人可以向我解释一下吗?谢谢!

更新

所以基本上我不明白的是spring classes + angular如何满足MVC模式的要求

例如,当您搜索弹簧层时,这是 Internet 上的第一个图表之一,但我认为这些与 MVC 不同

enter image description here

【问题讨论】:

  • 你能澄清你的问题吗?它只是关于 MVC 的清晰定义吗?这应该可以在互联网上的这么多页面上找到.....
  • 尝试将 MVC 模式扩展到 Spring Angular 是不可行的。您应该将 Angular 和 Spring 都视为它们自己的应用程序,它们都能够实现 MVC 模式。当前端有 Angular 时,Spring 通常不做任何与视图相关的事情,因此既没有控制器也没有视图。它提供模型,例如JSON 通过 Rest-Interface,由 Angular 的服务层使用并传播到 Components

标签: spring angular spring-boot model-view-controller


【解决方案1】:

如 cmets 中所述,Spring boot 的后端和 Angular 的前端都可以视为不同的应用程序,每个都遵循 Model-View-Controller 设计模式。

您还发布了three-tier architecture 的屏幕截图。这种类型的架构只告诉您如何构建代码。通常,您的应用程序的 MVC 部分位于 表示层(在您的屏幕截图中称为 Web 层)。

因此,如果您查看您的后端应用程序,您可以识别以下部分:

  • 数据层/存储库层:存储库
  • 业务层/服务层:服务
  • 表示层/Web层:Model-View-Controller + Dispatcher
    • 模型:无论您在服务中公开什么(可能是 DTO)
    • 查看:JSON 结构/映射
    • 控制器:弹簧控制器

对于您的前端,您也可以识别它们:

  • 数据层:HTTP 调用
  • 业务层:Angular 服务
  • 表示层:组件 + 路由器
    • 模型:无论您在服务中公开什么(可能与您在后端公开的结构相似)
    • 查看:模板
    • 控制器:组件

这有点过于简单了,可能不是每个人都会同意的。

【讨论】:

  • 我认为 Angular 使用 CBA 架构,这与 MVC 不同,因为 CBA 使用数据绑定和事件垂直分离模型视图和控制器。
  • @YassineBenHamida 当然在方法上存在一些差异,但普遍认为,Spring MVC 还可以处理事件(传入的 HTTP 请求)和绑定(它将数据绑定到 JSON 结构)。关键区别在于,MVC 是关于分离模型-视图-控制器,而 CBA 更多的是关于按组件分离,而不是关于分离模型、视图和控制器/...。
  • 但无论哪种方式,我在回答中要说明的最重要的一点是,您不应该将整个 Angular 应用程序视为后端 MVC 的一部分。它们是具有不同模式的独立应用程序。
  • 是的,但是当谈到您提供的图像中的层时,您到底是什么意思,因为表示层或“层”本身是有角度的,业务层是 Spring Boot 后端,而数据层是数据库服务器或持久数据层
  • @YassineBenHamida 这就是我不同的想法。我看到前端与后端完全分离,每个都有自己的表示层、业务层和数据层。在我的例子中,后端暴露的 API 是表示层,业务层是 Angular 服务和后端服务。
【解决方案2】:

我正在使用 Angular 作为前端和 Spring Boot 作为后端的同一个项目,我仍然对它的架构有点困惑,就像你一样,但我最终不得不采用 MVC 模型,因为我实际上是使用控制器、定义模型和渲染视图(json 结果)。

显然,您的前端使用 CBA(基于组件的架构,而您的后端使用 MVC 模式,因为 Spring MVC 嵌入在 Spring Boot 中,因此它实际上使用相同的逻辑。 这是 spring boot 如何在控制器之间调度和处理请求的简要图像,您可以将调度程序 servlet 视为前端和后端之间的中间件(但请记住,它嵌入在 spring boot 容器中)

【讨论】:

    【解决方案3】:

    Angular 是一个 SPA,一个单页应用程序。它包含所有内容,模型(更改业务数据)、视图(带有 HTML 的模板)和控制器(您的点击和组件中的其他事件处理程序)。

    Spring 后端是模型的扩展,用于执行进一步的数据转换并将其存储在数据库中。

    Model-View-Something(还有 MVVM 和派生类)是一种来自桌面应用程序的模式,但它并不真正适合 SPA 的世界。即使在桌面应用程序中,MVC 中的控制器也经常被视为多余的(因为它只是委托东西,而不是像视图和模型那样重要)。

    当您使用 Angular 时,重要的是要知道组件模式。它在 Angular、React、Vue 甚至 Vaadin 中都有效。组件是 HTML 和操作该 HTML 的脚本代码的块。并且组件可以相互嵌套,从而实现分层架构。

    【讨论】:

    • 我希望有人对此有所了解,我想知道其他人的想法。
    • 我不认为“Spring 是模型的扩展”,恰恰相反。模型(或其中的一部分)也可能存在于 Angular 中,因为它聚合和转换数据以适应用户的需要或 UI/UX 的要求。但是,具有所有业务逻辑和验证的完整模型可以在后端找到,至少在任何严肃的应用程序中是这样。因此,最终 Angular 可能包含模型的扩展,反之亦然。
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 2020-09-04
    • 2020-03-11
    • 2020-04-18
    • 2017-10-28
    • 1970-01-01
    • 2017-02-12
    • 2016-07-07
    相关资源
    最近更新 更多