如何最好地将Spring Boot服务/存储库层拆分为一个单独的Maven项目?

问题描述 投票:0回答:1

我正在使用一个带有Thymeleaf模板的Spring Boot应用程序来查看视图,以及三个“层”中的Java类:控制器,服务和存储库。我想将“服务”和“存储库”层移到一个单独的Maven项目(我称其为“服务层”)中,“视图/控制器”应用程序可以将其作为依赖项引入。

原因是我希望将相同的服务/存储库/数据库逻辑用于具有不同受众的其他将来的应用程序。对于前端和后端没有单独的运行程序的(微)服务体系结构,我没有开绿灯,但是我可以将code分开并在构建时将其合并时间。

仅分离服务和存储库的最佳方法是什么?这里有一些要澄清的要点,但是可能还有其他一些我没有想出要问的问题:

  • 在服务层工件的POM中,我需要哪些启动器和依赖项? spring-boot-starter-parentspring-boot-starter-jdbc?数据库驱动程序?

  • @Service@Repository批注在服务层工件中是否对我有帮助?

  • 例如,在运行服务层的项目中,是否需要带@SpringBootApplication注释的类? spring-boot-maven-plugin怎么样? (后者似乎阻止了“ mvn install”阶段。)

  • 我将数据源属性(如JDBC URL)放在哪里?在服务层的application.yml中,还是在依赖它的UX层项目中?

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

spring-boot maven dependencies modularity
1个回答
0
投票

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

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目录,用于存放类和资源,这些目录和资源仅用于测试,不会与打包的JAR或WAR捆绑在一起。在该目录结构中,我放置了一个带有注释的@SpringBootApplication类,以及带有数据库连接信息的application.yml。这用于运行集成测试,并且不会影响依赖于服务层的Web应用程序。

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

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

只要我确保前端应用程序始终调用最新版本的service-tier,它就会非常顺利地工作。

一个有趣的并发症是Spring Boot应用程序将仅扫描其自己的Java包中的服务和存储库类。最初,我的服务层位于“ com.mycompany.servicetier”之类的程序包层次结构中,前端位于诸如“ com.mycompany.appone”和“ com.mycompany.apptwo”之类的程序包中。我必须将每个前端项目中的@SpringBootApplication带注释的类上移一个级别到“ com.mycompany”,这样它才能发现“下面的”服务层类以进行依赖项注入。

© www.soinside.com 2019 - 2024. All rights reserved.