如何最好地将 Spring Boot service/repository 层拆分为单独的 Maven 项目?

How best to split Spring Boot service/repository tier off into a separate Maven project?

我正在开发一个 Spring 引导应用程序,其中包含用于视图的 Thymeleaf 模板,以及 Java class 三个 "tiers" 中的元素:控制器、服务和存储库。我想将服务层和存储库层移动到一个单独的 Maven 项目(我称之为 "service-tier"),"View/Controller" 应用程序可以将其作为依赖项引入。

这样做的原因是我希望将相同的 service/repository/database 逻辑用于其他不同受众的未来应用程序。我没有绿灯去使用单独的 运行ning 程序 用于前端和后端的(微)服务架构,但我可以分开code 并在构建时合并它。

仅将服务和存储库分开的最佳方法是什么?这里有一些具体要点需要澄清,但可能还有其他我没有弄清楚的问题需要问:

欢迎提供指向以这种方式划分的工作代码的指针!

经过反复试验,这就是我最终得到的,并且有效:

service-tier 是一个包含 @Service@Repository 注释的 Maven 项目。

  • 包含spring-boot-starter-parentspring-boot-starter-webspring-boot-starter-jdbcspring-boot-starter-security依赖,以及数据库驱动。还有一些测试范围的依赖项:JUnit、spring-boot-starter-testspring-security-test。这几乎是前端应用程序使用的所有依赖项,减去 Thymeleaf 和一些 Webjars 工件。

  • 我不知道注释对我有没有用,但我保留了它们。

  • 很久以后,我记得 Maven 项目有一个 test 目录用于 classes 和资源,这些资源将仅用于测试而不与打包的捆绑在一起JAR 或 WAR。在那个目录结构中,我放了一个 @SpringBootApplication 注释 class,以及带有数据库连接信息的 application.yml。这用于 运行 集成测试,不会影响依赖服务层的 Web 应用程序。

前端应用都是自己的Maven项目。在他们每个人中:

  • 他们声明 service-tier 为依赖项。
  • 它们还声明了所有 Spring 引导依赖项。许多都是多余的,但这不是 Maven 的问题。其他依赖项包括 spring-boot-starter-thymeleaf 和其他几个 Thymeleaf 依赖项,以及来自 org.webjars 的一些依赖项,其中包括 Bootstrap 和 JQuery.
  • 他们有自己的@SpringBootApplication注释classes和application.yml。这些是 "real" 配置,而不仅仅是测试配置。
  • 所有 @Controller classes 以及 Thymeleaf 模板和静态文件 messages.properties 都在这些前端项目中。
  • Spring 安全配置(即 WebSecurityConfigurerAdapter 个实例)在这些项目中。 (不过 UserDetailsService 在服务层中。)

只要我确保前端应用程序始终调用最新版本的service-tier,它就可以正常运行。

一个有趣的并发症 是 Spring 启动应用程序将只扫描它自己的 Java 包中的服务和存储库 classes .最初,我在“com.mycompany.servicetier”这样的包层次结构中有服务层,在“com.mycompany.appone”和“com.mycompany.apptwo”这样的包中有前端。我必须将每个前端项目中注释为 class 的 @SpringBootApplication 移动到更高一级,以“com.mycompany”,这样它就会发现服务层 classes "below it" 用于依赖注入。