我是一个dotnet开发人员,但现在我将致力于Spring Boot应用程序。令我困惑的一件事是,如何分隔API层,服务层和存储库层。在dotnet项目中,我们为服务和存储库层创建类项目,为API或表示层创建Web项目。但是在基于Maven的Spring Boot中似乎并不熟悉这种方法。尽管我在maven中发现可以创建单独的模块,但是不确定这是正确的方法。正确的方法,请分享一些示例实现。我可以遵循并做出决定的任何优秀的opensouce项目吗?
答案 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;
}
,security
,schedule
等的项目。每个项目都带有自己的messaging
(这是API端点),@Controller
和@Service
。像这样的东西。
@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就会加载它。
因此您可以:
将软件包用于Web控制器。通常,这对于小型项目/微服务/开始就足够了。
使用特殊的maven模块(将创建一个jar),该模块又将作为依赖项添加到spring boot构件中,然后再次在运行时无关紧要。
通常,如果您有一个复杂的项目,或者例如创建一个库(将其作为依赖项读取为依赖项)插入到项目中时,该库将自动公开某些终结点,这是有回报的。
第二种方法需要了解您将如何精确地管理依赖关系(例如:Web模块将依赖于business-logic-module,因为您将从控制器创建对某些服务的依赖关系,而控制器将没有依赖服务,代码将无法编译。
如果使用多模块,这里有两个技巧可能会为您节省一些时间:
@SpringBootApplication
的依赖关系,通常您将使用spring boot maven插件来构建它,而spring boot的JAR并不是真正的常规JAR,因此无法通过这种方式来实现maven依赖。 / li>