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

Spring boot 如何最好地将Spring启动服务/存储库层拆分为一个单独的Maven项目?,spring-boot,maven,dependencies,modularity,Spring Boot,Maven,Dependencies,Modularity,我正在开发一个Spring引导应用程序,其中包含用于视图的Thymeleaf模板,以及三个“层”中的Java类:控制器、服务和存储库。我想将服务层和存储库层移动到一个单独的Maven项目(我称之为“服务层”)中,“视图/控制器”应用程序可以将其作为依赖项引入 这样做的原因是,我希望对其他具有不同受众的未来应用程序使用相同的服务/存储库/数据库逻辑。我没有资格进入(微型)服务体系结构,该体系结构的前端和后端分别运行程序,但我可以在构建时分离代码并将其统一起来 区分服务和存储库的最佳方法是什么?这里

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

这样做的原因是,我希望对其他具有不同受众的未来应用程序使用相同的服务/存储库/数据库逻辑。我没有资格进入(微型)服务体系结构,该体系结构的前端和后端分别运行程序,但我可以在构建时分离代码并将其统一起来

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

  • 在服务层工件的POM中我需要什么启动器和依赖项<代码>弹簧启动启动器父级<代码>spring boot starter jdbc?数据库驱动程序

  • 如果
    @Service
    @Repository
    注释位于服务层工件中,它们对我有什么帮助吗

  • 例如,在“服务层”项目中,我是否需要一个
    @SpringBootApplication
    注释类来运行测试?spring boot maven插件怎么样?(后者似乎阻止了“mvn安装”阶段。)

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


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

经过多次尝试和错误,这就是我最终得到的结果,它是有效的:

服务层
是一个包含
@service
@Repository
注释的Maven项目

  • 它包含
    spring boot starter父级
    spring boot starter web
    spring boot starter jdbc
    spring boot starter安全性
    依赖项,以及数据库驱动程序。还有一些测试范围的依赖项:JUnit、
    SpringBootStarter测试
    SpringSecurity测试
    。这几乎是前端应用程序使用的所有依赖项,不包括Thymeleaf和一些Webjar工件

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

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

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

  • 它们将
    服务层
    声明为依赖项
  • 它们还声明了所有Spring引导依赖项。很多都是多余的,但这不是Maven的问题。其他依赖项包括
    spring boot starter thymeleaf
    和一些其他thymeleaf依赖项,以及org.webjar中的一些依赖项,其中包括Bootstrap和JQuery
  • 它们也有自己的
    @SpringBootApplication
    注释类和
    application.yml
    。这些是“真正的”配置,而不仅仅是测试配置
  • 所有
    @Controller
    类以及Thymeleaf模板、静态文件和
    消息。属性都在这些前端项目中
  • Spring安全配置(即
    WebSecurityConfigureAdapter
    实例)在这些项目中。(不过,
    UserDetailsService
    位于服务层。)
只要我确保前端应用程序始终调用最新版本的
服务层
,它的工作就相当顺利

一个有趣的复杂问题是,Spring引导应用程序将只扫描其自身Java包中的服务和存储库类。最初,我在包层次结构中有服务层,如“
com.mycompany.servicetier
”,在包中有前端,如“
com.mycompany.appone
”和“
com.mycompany.apptwo
”。我必须将每个前端项目中的
@SpringBootApplication
注释类移到更高一级的“
com.mycompany
”,这样它就可以发现“它下面”的服务层类以进行依赖注入