春季启动RESTful-三层架构

时间:2019-12-30 01:04:33

标签: java spring spring-boot maven

我是一个dotnet开发人员,但现在我将致力于Spring Boot应用程序。令我困惑的一件事是,如何分隔API层,服务层和存储库层。在dotnet项目中,我们为服务和存储库层创建类项目,为API或表示层创建Web项目。但是在基于Maven的Spring Boot中似乎并不熟悉这种方法。尽管我在maven中发现可以创建单独的模块,但是不确定这是正确的方法。正确的方法,请分享一些示例实现。我可以遵循并做出决定的任何优秀的opensouce项目吗?

3 个答案:

答案 0 :(得分:1)

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

您的请求从您的控制器转到服务层,在其中写入所有业务逻辑。您可以在服务层中执行所有特定于应用程序的功能,然后可以使用存储库层来保留所有数据。在这里,您可以使用JPA存储库。

您可以创建诸如Controller,Service和Repository(主要)之类的模块。您可以将实体和Dto用于所有数据传输和持久性目的。请求流主要是

Controller->Service->Repository(Optional).

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

答案 1 :(得分:1)

根据项目的规模以及如何定义模块的边界,有多种方式来组织代码。

例如,在我公司中,我们正在按业务领域将代码分成模块。我们有名为#include <iostream> #include <stdlib.h> using namespace std; int main() { int a = rand() % 11; cout << a; return 0; } securityschedule等的项目。每个项目都带有自己的messaging(这是API端点),@Controller@Service。像这样的东西。

Project structure

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

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

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

答案 2 :(得分:1)

  

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

实际上弹簧靴对模块的分离并不熟悉。我将尝试解释原因(这可能是主观意见,但希望它将有助于理解这些东西在Java世界中的工作方式)

Java模块通常由JAR表示为内置工件。好吧,从技术上讲,Java 9+中有“模块”,但可以将其放在一边以解决这个问题。 JAR只是包含在一起的类的包含。

在Java中,您运行的进程的类路径中有JAR(可以从中读取类),有时还可以在jar之外的类。

这就是问题:java不在乎从哪个JAR加载该类,而且通常没有人甚至试图了解从哪个JAR加载该类。只要该类存在于类路径中,并且Java运行时可以加载它,就可以了。

现在,Spring Boot是一个“运行时”框架,从某种意义上说,它实际上并没有编译任何东西,您可以给它提供带有类的JAR,然后尝试从中加载项目。 例如,对“ com.foo.bar”的组件扫描将扫描此程序包中的类,以便该类可以位于类路径中的任何JAR中。

关于网页层。 Spring / Spring引导中的控制器可能像您已经弄清楚的那样。例如:spring说:“我将公开一个用@RestController注释的类的Web终结点”。它实际上并不关心带注释的类所属的jar。只要它遵循组件扫描策略(还有其他技术),spring就会加载它。

因此您可以:

  1. 将软件包用于Web控制器。通常,这对于小型项目/微服务/开始就足够了。

  2. 使用特殊的maven模块(将创建一个jar),该模块又将作为依赖项添加到spring boot构件中,然后再次在运行时无关紧要。
    通常,如果您有一个复杂的项目,或者例如创建一个库(将其作为依赖项读取为依赖项)插入到项目中时,该库将自动公开某些终结点,这是有回报的。

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

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

  • 避免循环依赖:在Maven中,它在春季通常不起作用(构建时间),通常不起作用,有一些解决方法,但是它们通常指向代码气味。简而言之,不要去那里
  • 不要定义包含@SpringBootApplication的依赖关系,通常您将使用spring boot maven插件来构建它,而spring boot的JAR并不是真正的常规JAR,因此无法通过这种方式来实现maven依赖。 / li>