We will start with What ApplicationRunner and CommandLineRunner is and when to use it and their ordering.
Spring Boot provides two interfaces CommandLineRunner
and ApplicationRunner
to run specific piece of code when application is fully started. These interfaces get called just before run()
on SpringApplication
completes.
This interface provides access to application arguments as string array. Let's see the example code for more clarity.
@Component
public class CommandLineAppStartupRunner implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(CommandLineAppStartupRunner.class);
@Override
public void run(String... args) throws Exception {
logger.info("Application started with command-line arguments: {} . \n To kill this application, press Ctrl + C.", Arrays.toString(args));
}
}
ApplicationRunner
wraps the raw application arguments and exposes interface ApplicationArguments
which have many convinent methods to get arguments like getOptionNames()
return all the arguments names, getOptionValues()
return the agrument value and raw source arguments with method getSourceArgs()
. Let's see an example code.
@Component
public class AppStartupRunner implements ApplicationRunner {
private static final Logger logger = LoggerFactory.getLogger(AppStartupRunner.class);
@Override
public void run(ApplicationArguments args) throws Exception {
logger.info("Your application started with option names : {}", args.getOptionNames());
}
}
When you want to execute some piece of code exactly before the application startup completes, you can use it. In one of our project, we used these to source data from other microservice via service discovery which was registered in consul.
You can register as many application/commandline runner as you want. You just need to register them as Bean in the application context and Spring Application will automatically picks them up. You can order them as well either by extending interface org.springframework.core.Ordered
or by @Order
annotation.
This is all about application/commandline runner. You can also see org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner
in spring-batch which implements CommandLineRunner
to register and start batch jobs at application startup. I hope you find this informative and helpful. You can look at the full example code on Github.