在使用Spring Boot创建命令行应用程序时需要注意的要点

请注意以下几点。

    • spring-boot-starter-webは使わない

 

    本処理の実装でCommandLineRunnerは使わない(私見)

不使用spring-boot-starter-web

在创建命令行应用程序时,不应该在pom.xml的依赖中使用spring-boot-starter-web。

只要使用spring-boot-starter-web,即使自以为是创建了一个命令行应用程序,启动后也会启动Web服务器。如果仔细查看日志,应该就能看到正在启动Web服务器。

如果是命令行应用程序,请使用spring-boot-starter。

pom.xml的模板如下:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.5.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

在本处理的实现中,不使用CommandLineRunner(个人观点)。

※这仅代表个人观点,不能明确断定。

常见的样例中,通常会将主类作为CommandLineRunner的实现类进行创建,并在run方法中编写应用程序的主要处理逻辑。起初我也认为应该按照这样的方式来进行开发。

@SpringBootApplication
public class Application implements CommandLineRunner {
    public static void main(String[] args) {
        System.out.println("main()");
        SpringApplication.run(Application.class, args);
    }
    @Override
    public void run(String... args) throws Exception {
        System.out.println("処理開始");
        //アプリの処理
        System.out.println("処理終了");
    }
}

然而,使用这种方法会在使用JUnit时产生问题。

创建并执行以下空的测试方法。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ApplicationTest {
    @Test
    public void test() {
    }
}
:
処理開始
処理終了
:

这是怎么回事。竟然会执行未调用的应用程序的主处理。
这样一来,在从容器(如Repository类)中获取实例并进行测试的情况下,每次都会执行主处理,变得非常麻烦。

因此,我们不再使用CommandLineRunner来实现主处理程序,而是从main方法中自己调用主处理程序,如下所示。

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        System.out.println("main()");
        try (ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args)) {
            Application app = ctx.getBean(Application.class);
            app.run(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void run(String... args) throws Exception {
        System.out.println("処理開始");
        //アプリの処理
        System.out.println("処理終了");
    }
}

顺便提一下,SpringBoot文档中写道:

22.6 使用 CommandLineRunner

如果你想要访问原始的命令行参数,或者你需要在SpringApplication启动后运行一些特定的代码,你可以实现CommandLineRunner接口。所有实现该接口的Spring bean都会调用run(String…​ args)方法。

使用CommandLineRunner,

    • コマンドライン引数を参照したいとき

 

    起動時に一度だけ実行したい処理があるとき

可以理解为是写入了一种辅助性处理的目的。

广告
将在 10 秒后关闭
bannerAds