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.
CommandLineRunner
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
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 this.
@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 to use it
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.
Ordering
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 grab the full example code on Github.
Good article...
ReplyDeleteInformative post. Keep it up!!!
ReplyDelete