gpt4 book ai didi

spring - 类路径上的多个 ApplicationRunners,如何使 SpringApplication.run() 只运行一个

转载 作者:行者123 更新时间:2023-12-05 09:21:00 29 4
gpt4 key购买 nike

上下文:我有一个项目,其中包含一些实用程序来执行数据修复等操作。每个实用程序都是一个 Java 应用程序,即具有 main() 方法的类。我想将它们定义为 Spring Boot 应用程序,以便我可以使用 ApplicationRunnerApplicationArguments 工具。 Spring 配置是通过共享配置类中的注释定义的。我在下面给出了此设置的最小示例。

预期:如果我调用 SpringApplication.run(SomeClass.class, args),其中 SomeClass 是一个 ApplicationRunner,它会运行 run() 在该类上运行,而不在应用程序上下文中的任何其他类上运行。

实际发生了什么:它调用它在上下文中的所有 ApplicationRunners

为什么?我理解 SpringApplication.run(Class, String[]) 的意思是“运行这个类”,而它似乎意味着“从这个类加载一个应用程序上下文并运行你能在其中找到的任何东西”。我应该如何修复它以仅运行 1 节课?我不介意我的其他应用程序类是否不在应用程序上下文中,因为我需要的所有配置都在共享配置类中。但我不想根据我需要运行的类来编辑代码(例如添加或删除注释)。

最小的例子:

一个 Spring 配置类(共享):

package com.stackoverflow.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ExampleSpringConfig {
/** Some bean - just here to check that beans from this config are injected */
@Bean public FooService fooService () {
return new FooService();
}
}

两个应用类

package com.stackoverflow.example;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.Resource;

@SpringBootApplication
public class SomethingJob implements ApplicationRunner {
@Resource private FooService fooService;

public void run(ApplicationArguments args) throws Exception {
System.out.println("Doing something"); // do things with FooService here
}

public static void main(String[] args) {
SpringApplication.run(SomethingJob.class, args);
}
}

另一个除了打印“Doing something else”之外完全相同。

输出:

[Spring Boot startup logs...]
Doing something else
Doing something
[Spring Boot shutdown logs...]

最佳答案

首先,只有一个类应该使用@SpringBootApplication 注解。正如您在回答中注意到的那样,这定义了外部“主要”入口点。为了清晰和概念分离,我建议这是一个与您的 ApplicationRunner 类不同的类。

为了只让一些而不是所有的运行器运行,我通过解析参数并快速退出不应调用的运行器来完成此操作。例如

package com.stackoverflow.example;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.annotation.Resource;

@Component
public class SomethingJob implements ApplicationRunner {
@Resource private FooService fooService;

public void run(ApplicationArguments args) throws Exception {
if (!args.containsOption("something")) return

System.out.println("Doing something"); // do things with FooService here
}

}

那样你可以做 java -jar myjar.jar --somethingjava -jar myjar.jar --something-else 取决于你想成为哪一个跑。

关于spring - 类路径上的多个 ApplicationRunners,如何使 SpringApplication.run() 只运行一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35478679/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com