运行 Spring Boot Web 应用程序中的脚本

Running Scripts in a Sprint Boot Web Application

我有一个 Spring 打包为 WAR 文件的启动 Web 应用程序,我希望能够 运行 按需执行某些任务(脚本或命令)。例如:

如果这些 "commands" 可以访问与 Web 应用程序本身相同的 bean(服务、DAO)和模型,那么实施起来会容易得多。我希望我必须在某个地方创建一个 Spring 应用程序上下文才能发生这种情况。我还更愿意将这些命令与应用程序的其余部分打包在一起,以便与它一起进行测试并易于部署。

本质上,我想知道如何实现类似于 Laravel's artisan commands (PHP) 的东西。

我在 运行ning a class inside a WAR here and here. I'm searching for the "Spring way" of packaging and running commands. Do I have to integrate Spring Batch jobs 上读过这个吗?据我了解,Spring Batch 适用于较大的工作负载,可以分成多个批次。我应该硬着头皮将命令放在引用第一个的第二个单独的 Maven 模块中吗?

更新

我实现了一个 ApplicationRunner(感谢 Stefan!)以查看它们是如何工作的,并发现它们在 Spring 应用程序上下文刷新后 运行。这意味着整个 Web 应用程序在 运行ner 执行之前已初始化并处于活动状态。这包括 MVC 端点映射器和配置中定义的计划任务。虽然这绝对有用,但我需要 运行 命令,因为它可能与命令冲突(尤其是在命令 运行s 期间的瞬态数据状态)。

更新 2

我只需要创建另一个可执行 jar,它使用 CommandLineRunner 创建 Spring 启动应用程序。如果我使用 3 个模块,这可以引用 Web 应用程序中的所有 bean:

  1. spring "service" beans 模块
  2. 网络应用模块
  3. 命令行运行ner模块

您可以使用ApplicationRunner 参见 spring boot application runner。 运行程序在应用程序启动后执行,您可以访问 spring 上下文。

CommandLineRunner class 正是用于此目的。另见 How does a Spring Boot console based application work?

通过使用spring data jpa,你可以轻松实现这个

1-通过开发代表您的数据库模式的实体 类 并设置 属性 spring.jpa.hibernate.ddl-auto=create,当您 运行 应用程序(小心,因为每次你 运行 模式都会被删除并为你重新创建)

2-你可以在 import.sql 中包含任何 sql 语句,它应该与配置文件一起放在资源文件夹中(这是一个休眠功能,但仍然可以很好地与 spring ).

initialize database with jpa

initialize database with hibernate