在使用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,
-
- コマンドライン引数を参照したいとき
- 起動時に一度だけ実行したい処理があるとき
可以理解为是写入了一种辅助性处理的目的。