【问题标题】:Spring boot RESTful - three tier architectureSpring Boot RESTful——三层架构
【发布时间】:2020-04-18 20:03:19
【问题描述】:

我是一名 dotnet 开发人员,但现在我将致力于 Spring Boot 应用程序。让我困惑的一件事是我们如何分离 API 层、服务层和存储库层。在 dotnet 项目中,我们为服务层和存储库层创建类项目,并为 API 或表示层创建 Web 项目。但是在基于 maven 的 spring boot 中似乎对这种方法并不熟悉。虽然我在 Maven 中发现您可以创建单独的模块,但不确定这是正确的方法。无论哪种方式正确,请分享一些示例实现。有什么好的开源项目可供我遵循并做出决定?

【问题讨论】:

标签: java spring spring-boot maven


【解决方案1】:

您使用控制器类将所有 API 请求路由到您的应用程序中。

您的请求从您的控制器发送到服务层,您的所有业务逻辑都在此编写。您在服务层执行所有特定于应用程序的功能,然后您可以使用存储库层来持久化所有数据。在这里您可以使用 JPA 存储库。

您可以(主要)创建控制器、服务和存储库等模块。您可以将实体和 Dto 用于所有数据传输和持久性目的。主要是请求流程

Controller->Service->Repository(Optional).

您在控制器中执行所有 API 路由。

【讨论】:

    【解决方案2】:

    根据您的项目规模和您定义模块边界的方式,有多种方法可以组织您的代码。

    例如,在我的公司,我们按业务领域将代码分成模块。我们有名为securityschedulemessaging 等的项目。每个项目都有自己的一组@Controller(即API 端点)、@Service@Repository。像这样的。

    configuration 用于@Configuration 类。 controller 用于 @Controller 类。 db.domain 用于 @Entity 类。 db.repo 用于@Repository 接口。 service 用于 @Service 类。 dto 用于将数据从 @Entity 类转换为 API 端点的某种自定义格式的自定义类。

    在您的情况下,如果您想为@Controller@Service@Repository 拥有单独的项目,您只需要使用 Maven 来声明您的项目之间的依赖关系。例如,@Service 项目应将@Repository 项目作为依赖项之一。

    在这种情况下,最好设置multi-module Maven project。随后,您可以非常轻松地声明任何项目之间的依赖关系。

    【讨论】:

      【解决方案3】:

      在 dotnet 项目中,我们为服务层和存储库层创建类项目,并为 API 或表示层创建 Web 项目。但是在基于maven的spring boot中似乎对这种方法不太熟悉。

      确实spring boot不熟悉模块的分离。我将尝试解释原因(这可能是主观意见,但希望它有助于理解这些东西在 java 世界中是如何工作的)

      Java 模块通常由 JAR 表示为构建的工件。好吧,从技术上讲,java 9+ 中有“模块”,但让我们将它们放在一边,以解决这个问题。 JAR 只是一个包含压缩在一起的类。

      在 java 中,您运行的进程在其类路径中包含 JAR(可以从中读取类)+ 有时是 jar 之外的类。

      事情是这样的:java 不关心类是从哪个 JAR 加载的,而且通常没有人试图了解类是从哪个 JAR 加载的。只要类存在于类路径中并且 java 运行时可以加载它,你就可以开始了。

      现在 spring boot 是一个“运行时”框架,从某种意义上说,它并没有真正编译任何东西,你给它带有类的 JAR,它会尝试从它们加载项目。 例如,“com.foo.bar”的组件扫描将扫描此包中的类,以便该类可以位于类路径中的任何 JAR 中。

      至于网络层。 Spring / Spring boot 具有您可能已经想到的控制器。例如:spring 说:“我将为带有 @RestController 注释的类公开一个 Web 端点”。它并不真正关心带注释的类所属的真实 jar。只要它遵循组件扫描策略(还有其他技术)spring 就会加载它。

      所以你可以:

      1. 为 Web 控制器使用包。通常这对于小型项目/微服务/开始的东西来说已经足够了。

      2. 使用一个特殊的 maven 模块(它将创建一个 jar),该模块又将作为依赖项添加到 spring boot 工件,然后再一次,它在运行时并不重要。
        通常,如果您有一个复杂的项目,或者例如创建一个库,一旦您将其插入项目(读取为依赖项添加)就会自动公开一些端点。

      第二种方法需要了解您将如何管理依赖项(例如:web 模块将依赖于 business-logic-module,因为您将从控制器创建对某些服务的依赖项,而控制器不会有依赖服务代码将无法编译)。

      如果您使用多模块,这里有两个提示可能会为您节省一些时间:

      • 避免循环依赖:在 maven 中,它在 spring 中不起作用(构建时间)通常不起作用,有一些解决方法,但它们通常指向代码异味。总之,不要去那里
      • 不要定义包含@SpringBootApplication的依赖,通常你会用spring boot maven插件构建它,而spring boot的JAR并不是真正的常规JAR,因此maven依赖不能这样做)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 2012-02-27
        相关资源
        最近更新 更多