我正在使用一个带有Thymeleaf模板的Spring Boot应用程序来查看视图,以及三个“层”中的Java类:控制器,服务和存储库。我想将“服务”和“存储库”层移到一个单独的Maven项目(我称其为“服务层”)中,“视图/控制器”应用程序可以将其作为依赖项引入。
原因是我希望将相同的服务/存储库/数据库逻辑用于具有不同受众的其他将来的应用程序。对于前端和后端没有单独的运行程序的(微)服务体系结构,我没有开绿灯,但是我可以将code分开并在构建时将其合并时间。
仅分离服务和存储库的最佳方法是什么?这里有一些要澄清的要点,但是可能还有其他一些我没有想出要问的问题:
在服务层工件的POM中,我需要哪些启动器和依赖项? spring-boot-starter-parent
? spring-boot-starter-jdbc
?数据库驱动程序?
@Service
和@Repository
批注在服务层工件中是否对我有帮助?
例如,在运行服务层的项目中,是否需要带@SpringBootApplication
注释的类? spring-boot-maven-plugin
怎么样? (后者似乎阻止了“ mvn install
”阶段。)
我将数据源属性(如JDBC URL)放在哪里?在服务层的application.yml
中,还是在依赖它的UX层项目中?
欢迎以这种方式划分的工作代码指针!
经过反复试验,这是我最终得到的结果,并且有效:
service-tier
是一个包含@Service
和@Repository
批注的Maven项目。
它包含spring-boot-starter-parent
,spring-boot-starter-web
,spring-boot-starter-jdbc
,spring-boot-starter-security
依赖项以及数据库驱动程序。也有一些测试范围的依赖项:JUnit,spring-boot-starter-test
和spring-security-test
。这几乎是前端应用程序使用的所有依赖项,减去Thymeleaf和一些Webjars工件。
我不知道注释是否对我有帮助,但我保留了它们。
过了很长时间,我记得Maven项目有一个test
目录,用于存放类和资源,这些目录和资源仅用于测试,不会与打包的JAR或WAR捆绑在一起。在该目录结构中,我放置了一个带有注释的@SpringBootApplication
类,以及带有数据库连接信息的application.yml
。这用于运行集成测试,并且不会影响依赖于服务层的Web应用程序。
前端应用程序是他们自己的Maven项目。在每个人中:
service-tier
声明为依赖项。spring-boot-starter-thymeleaf
和其他几个Thymeleaf依赖关系,以及来自org.webjars的一些依赖关系,其中包括Bootstrap和JQuery。@SpringBootApplication
注释类和application.yml
。这些是“实际”配置,而不仅仅是测试配置。@Controller
类以及Thymeleaf模板和静态文件以及messages.properties
在这些前端项目中。WebSecurityConfigurerAdapter
实例)在这些项目中。 (不过UserDetailsService
在服务层中。)只要我确保前端应用程序始终调用最新版本的service-tier
,它就会非常顺利地工作。
一个有趣的并发症是Spring Boot应用程序将仅扫描其自己的Java包中的服务和存储库类。最初,我的服务层位于“ com.mycompany.servicetier
”之类的程序包层次结构中,前端位于诸如“ com.mycompany.appone
”和“ com.mycompany.apptwo
”之类的程序包中。我必须将每个前端项目中的@SpringBootApplication
带注释的类上移一个级别到“ com.mycompany
”,这样它才能发现“下面的”服务层类以进行依赖项注入。