如何最好地将 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 并在构建时合并它。
仅将服务和存储库分开的最佳方法是什么?这里有一些具体要点需要澄清,但可能还有其他我没有弄清楚的问题需要问:
在服务层工件的 POM 中我需要哪些启动器和依赖项? spring-boot-starter-parent
? spring-boot-starter-jdbc
?数据库驱动?
如果 @Service
和 @Repository
注释在服务层工件中,它们对我有用吗?
我是否需要 "service-tier" 项目中的 @SpringBootApplication
注释 class,例如 运行 测试? 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
目录用于 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" 用于依赖注入。
我正在开发一个 Spring 引导应用程序,其中包含用于视图的 Thymeleaf 模板,以及 Java class 三个 "tiers" 中的元素:控制器、服务和存储库。我想将服务层和存储库层移动到一个单独的 Maven 项目(我称之为 "service-tier"),"View/Controller" 应用程序可以将其作为依赖项引入。
这样做的原因是我希望将相同的 service/repository/database 逻辑用于其他不同受众的未来应用程序。我没有绿灯去使用单独的 运行ning 程序 用于前端和后端的(微)服务架构,但我可以分开code 并在构建时合并它。
仅将服务和存储库分开的最佳方法是什么?这里有一些具体要点需要澄清,但可能还有其他我没有弄清楚的问题需要问:
在服务层工件的 POM 中我需要哪些启动器和依赖项?
spring-boot-starter-parent
?spring-boot-starter-jdbc
?数据库驱动?如果
@Service
和@Repository
注释在服务层工件中,它们对我有用吗?我是否需要 "service-tier" 项目中的
@SpringBootApplication
注释 class,例如 运行 测试?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
目录用于 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" 用于依赖注入。