如何在 Spring Boot REST 应用程序中重用类?

Posted

技术标签:

【中文标题】如何在 Spring Boot REST 应用程序中重用类?【英文标题】:How to reuse classes in a Spring Boot REST application? 【发布时间】:2017-05-04 22:18:31 【问题描述】:

我有一个 Spring Boot REST 应用程序,其中包含运行良好的 JPA 实体和存储库类(和相关服务)。现在我想将这些类重用于其他目的,比如每周的 CRON 作业和类似的一次性进程,它们将从命令行运行。

最好的方法是什么?挑战在于持久化上下文属性是在 application.properties 中设置的,并且除非应用程序类被初始化,否则持久化上下文不会被初始化。

我可以将所有这些类分解到一个单独的项目中,并使用不同的方式在其中定义持久性上下文,但是如果实体或 DAO 方法发生任何变化,这将变得更加令人头疼。

我真正想要的是从命令行告诉 Spring Boot 运行另一个类而不是主应用程序(并正确初始化持久性上下文)。有什么办法吗?

(注意我问了一个类似的问题,但没有得到回应:Possible to use Spring Boot repositories from another main class?)

[Edit] 是否可以通过创建一个实现 CommandLineRunner 的 @component 来做到这一点?我只希望它运行一个简单的一次性进程,而不是完整的 REST 应用程序。

【问题讨论】:

【参考方案1】:

有很多方法可以做到这一点。 您可以拥有多个 Main 类,然后选择您要启动的应用程序select main class,但是如果您不知道 ComponetScan 的工作原理,如果您不小心,最终会同时加载这两个应用程序。

另一种方法是使用Profiles,您可以在启动spring应用程序时设置配置文件,然后拥有将启动Tomcat的Web配置文件,以及不会启动Tomcat的命令行配置文件。

在我正在处理的项目中,我们选择将数据层作为一个完全独立的模块(相同的 gradle 项目),它有自己的 Spring 上下文。然后将数据层 spring 上下文用作其他应用程序的父上下文,作为可重用组件。这是一种更清晰的关注点分离,共享代码被清楚地标记,而不是在同一个代码块中拥有多个应用程序。

【讨论】:

感谢您的回复。我已经尝试过多个 Main 类的事情,但要么我做错了,要么它没有正确初始化持久性上下文。我确实想将 DAO 层从 REST 应用程序中分离出来,但我在使持久性上下文正常工作时遇到了太多麻烦。您是否有一个简单的示例如何做到这一点,但仍然可以从 REST 控制器/服务层访问它? 我终于能够使用 Profiles 来实现这一点,但它并不像您描述的那么简单。我将写一个更详细的解释作为单独的答案。但是我非常感谢你为我指明了正确的方向,我仍然很好奇如何将持久性上下文作为一个单独的 Spring Boot 项目。 @Klaus 当您说数据层作为一个完全独立的模块时,它是否有自己的 Main 类?你介意,请分享文件结构吗?我有一个带有独立 DO 和 Service 模块的 Java 6 项目。我正在努力使用 Spring Boot 做类似的事情?

以上是关于如何在 Spring Boot REST 应用程序中重用类?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 应用程序中实现长轮询 REST 端点?

如何在 Spring Boot REST 应用程序中重用类?

如何将 Firebase 与 Spring Boot REST 应用程序一起使用?

如何在 Spring Boot 服务应用程序中的 REST 服务调用之间按原样传递请求参数?

如何在外部 tomcat 中部署 Spring-boot REST API

如何使用 Spring Boot 应用程序从 Rest API 返回 html