In this post, we will discuss and explore the CommandLineRunner interface in Spring Boot. We will be covering different features of this interface and when to use this interface.
Introduction
CommandLineRunner interface in Spring Boot provides an option to run a specific piece of code when the application is fully started. This interface called automatically by the Spring Boot after the initial bootstrapping of application.
1. CommandLineRunner
@Component
public class CustomCommandLineRunner implements CommandLineRunner {
private static final Logger LOG = LoggerFactory.getLogger(CustomCommandLineRunner.class);
@Override
public void run(String...args) throws Exception {
LOG.info("Custom command line runner is excuted with command line arguments: {}", Arrays.toString(args));
}
}
CommandLineRunner
interface offers a single run
method, which is called just before SpringApplication.run(… )
completes. If we run our code, following log will be visible on the server console.
2018-07-06 21:54:11.096 INFO 27045 --- [ main] c.j.SpringBootExampleApplication : Started SpringBootExampleApplication in 2.195 seconds (JVM running for 2.998)
2018-07-06 21:54:11.098 INFO 27045 --- [ main] c.j.commandline.CustomCommandLineRunner : Custom command line runner is excuted with command line arguments: []
The CommandLineRunner
interfaces provide access to application arguments as a simple string array.
2. CommandLineRunner Ordering
We can use any number of CommandLineRunner in our application. In case we like to call our CommandLineRunner in a specific order, we have the following two options.
- Implement
org.springframework.core.Ordered
interface. - Use
@Order
annotation.
2.1 Ordering using Ordered interface
Implement Ordered interface and getOrder()
method to provide priority for the custom runner.
@Component
public class CustomCommandLineRunner implements CommandLineRunner, Ordered {
private static final Logger LOG = LoggerFactory.getLogger(CustomCommandLineRunner.class);
@Override
public void run(String...args) throws Exception {
LOG.info("Custom command line runner is excuted with command line arguments: {}", Arrays.toString(args));
}
@Override
public int getOrder() {
return 2;
}
}
2.2 Ordering using @Order annotation
Implement @Order
annotation to provide priority for the custom runner.
@Component
@Order(1)
public class CustomCommandLineRunner2 implements CommandLineRunner {
private static final Logger LOG = LoggerFactory.getLogger(CustomCommandLineRunner2.class);
@Override
public void run(String...args) throws Exception {
LOG.info("Calling second command line runner with arguments {}", Arrays.toString(args));
}
}
If we run our application, following output is visible on the server console
2018-07-06 22:03:13.906 INFO 27190 --- [ main] c.j.SpringBootExampleApplication : Started SpringBootExampleApplication in 1.811 seconds (JVM running for 2.555)
2018-07-06 22:03:13.907 INFO 27190 --- [ main] c.j.c.CustomCommandLineRunner2 : Calling second command line runner with arguments []
2018-07-06 22:03:13.907 INFO 27190 --- [ main] c.j.commandline.CustomCommandLineRunner : Custom command line runner is excuted with command line arguments: []
[pullquote align=”normal”]The lower the number, the higher the precedence [/pullquote]
3. When to Use CommandLineRunner
CommandLineRunner interface in Spring Boot application is an important tool. Here are some of the common use cases for this interface.
- Preparing application initial data.
- Source data from external services.
Summary
In this short post, we discussed the CommandLineRunner interface. We covered what are the use cases for the interface and how to create and order multiple interfaces based on the application requirements. Code snippets for this post are available on GitHub