当前位置: 首页 > 知识库问答 >
问题:

如何基于命令行参数加载Spring配置?

潘琪
2023-03-14

我有几个不同的@Configuration类,每个类对应一个不同的Spring批处理作业,也就是说,每个配置中都有一个作业bean,给定作业所需的每个步骤、Tasklet等都存在于与该作业相同的配置类中。例子:

@Configuration
public class DemoJobConfiguration(JobBuilderFactory jobBuilderFactory) {
    @Bean
    public Job demoJob() {
        return jobBuilderFactory.get("demoJob").start(...).build();
    }
}

@Configuration
public class TestJobConfiguration(JobBuilderFactory jobBuilderFactory) {
    @Bean
    public Job testJob() {
        return jobBuilderFactory.get("testJob").start(...).build();
    }
}

该应用程序是一个命令行应用程序。第一个参数是要运行的作业的名称。基于该参数检索关联的作业bean,然后使用JobLauncher执行。例子:

@Override
public void run(String... args) throws Exception {
    String jobName = args[0];
    Job job = prepareJob(jobName); //gets the Job from the application context
    JobParameters jobParameters = prepareJobParameters(args); //sets args[1], etc. to JobParameter objects
    JobExecution result = jobLauncher.run(job, jobParameters);
}

我想知道的是,如果args[0]是某个特定值,是否有一种方法可以使用@Conditional注释(或其他东西)只加载配置类,例如。,

@Configuration
@Conditional("\"testJob\".equals(args[0])")
public class TestJobConfiguration(JobBuilderFactory jobBuilderFactory) {
    ...
}

这样做的好处是,只有与正在运行的作业相关的bean才会被加载到内存中,而与其他作业对应的bean永远不会被加载。随着更多的作业被添加到项目中,这将非常有帮助。

是否可以基于命令行参数加载配置?以前做过吗?一个小时的谷歌搜索没有发现任何东西,但我仍然希望有办法实现这一点。

共有2个答案

欧阳声
2023-03-14

如果您希望基于命令行参数对条件配置进行更多的控制,您可以创建一个自定义条件,该条件可以使用Application ationArguments类来完全解析选项:

public class CustomCommandLineArgsCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        ApplicationArguments args = context.getBeanFactory().getBean(ApplicationArguments.class);

        //Do something with the command line arguments.
        return true;
    }
}

然后,您可以使用@Con条件(Custom47dLineArgsCondition.class)注释您的配置类。

红明德
2023-03-14

我想出了自己问题的答案。

解决方案

>

  • 在--jobName=testJobs的表单中包含命令行参数。Spring Boot将自动加载到环境中(https://docs.spring.io/spring-boot/docs/1.0.1.RELEASE/reference/html/boot-features-external-config.html)

    使用@ConditonalOnProperty注释,如下所示:

    @ConditionalOnProperty(value=“jobName”,havingValue=“testJob”)公共类TestJobConfiguration{…}

  •  类似资料:
    • 我已经用spring cloud任务创建了Spring Boot应用程序,它应该执行一些命令(任务)。每个任务/命令都是短命任务,所有任务都是从命令行启动,做一些短命的ETL作业并完成执行。 有一个包含所有命令/任务的spring boot jar。每个任务都是CommandLineRunner,我喜欢根据来自命令行的参数来决定将执行哪些任务(一个或多个)。这样做的最佳做法是什么?我不喜欢有肮脏代

    • 我有一个应用程序,它有两个配置文件,并且还需要一个命令行参数。我想使用命令运行这个应用程序,但每次我这样做时,只有配置文件被选中。 application.properties(默认配置文件) application-prod.properties(产品剖面) 我尝试执行以下命令和时间只有配置文件被选中。 我是否以正确的方式传递spring boot配置文件名称? 还请告知,如果这可以实现使用命令

    • 我希望我的spring应用程序根据它被调用的方式执行不同的操作。所以 将运行webapp 将执行某些功能并退出 等 做这件事的正确方法是什么?

    • 问题内容: 我正在使用eclipse,因此将运行配置设置为 -Dspring-boot.run.arguments =-person.name = firstName 但是,当运行我的应用程序时,出现异常,因为“无法解析值“ $ {person.name}”中的占位符“ person.name”” 问题答案: 这段代码可以正常工作(Spring Boot 2.1.4): 命令行: 输出:

    • 为了方便起见,我们支持在运行 Blade 应用的时候修改一些配置,比如我在运行时指定端口: java -jar blade-app.jar --server.port=9088 当然还支持一些其他的命令行参数,看看下面的表格: 命令行参数 描述 示例 server.address 服务地址,默认是本机 0.0.0.0 回环地址 --server.address=192.168.1.100 serv

    • 1.2. 命令行参数 大多数的程序都是处理输入,产生输出;这也正是“计算”的定义。但是, 程序如何获取要处理的输入数据呢?一些程序生成自己的数据,但通常情况下,输入来自于程序外部:文件、网络连接、其它程序的输出、敲键盘的用户、命令行参数或其它类似输入源。下面几个例子会讨论其中几个输入源,首先是命令行参数。 os包以跨平台的方式,提供了一些与操作系统交互的函数和变量。程序的命令行参数可从os包的Ar