When using spring boot to build application startup, we start the application through the command line in our work. Sometimes we need some specific parameters to do some initialization operations when the application starts.
spring boot provides two interfaces for users: CommandLineRunner and ApplicationRunner.
1. CommandLineRunner
1.1 statement:
@FunctionalInterface public interface CommandLineRunner { /** * Callback used to run the bean. * @param args incoming main method arguments * @throws Exception on error */ void run(String... args) throws Exception; }
1.2 use:
package com.example.consoleapplication; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class TestRunner implements CommandLineRunner { @Override public void run(String... args) { // Do something... for(String arg: args){ System.out.println(arg); } System.out.print("test command runner"); } }
1.3 operation results
Run: java -jar build/libs/consoleapplication-0.0.1-SNAPSHOT.jar -sdfsaf sdfas,
The results are as follows:
2019-03-16 17:31:56.544 INFO 18679 --- [ main] c.e.consoleapplication.DemoApplication : No active profile set, falling back to default profiles: default 2019-03-16 17:31:57.195 INFO 18679 --- [ main] c.e.consoleapplication.DemoApplication : Started DemoApplication in 16.172 seconds (JVM running for 16.65) -sdfsaf sdfas test command runner%
2. ApplicationRunner
2.1 statement
/** * Interface used to indicate that a bean should <em>run</em> when it is contained within * a {@link SpringApplication}. Multiple {@link ApplicationRunner} beans can be defined * within the same application context and can be ordered using the {@link Ordered} * interface or {@link Order @Order} annotation. * * @author Phillip Webb * @since 1.3.0 * @see CommandLineRunner */ @FunctionalInterface public interface ApplicationRunner { /** * Callback used to run the bean. * @param args incoming application arguments * @throws Exception on error */ void run(ApplicationArguments args) throws Exception; }
2.2 use
ApplicationRunner
andCommandLineRunner
There are differences in the use of:
CommandLineRunner
The parameters are only divided according to the space.
ApplicationRunner
According to whether it matches--key=value
To parse the parameters,
- Match, then
optional
Parameters, availablegetOptionValues
Gets the parameter value.- No match is
non optional
Parameters.package com.example.consoleapplication; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import org.springframework.boot.ApplicationArguments; @Component public class TestApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { // Do something... System.out.println("option arg names" + args.getOptionNames()); System.out.println("non option+" + args.getNonOptionArgs()); } }
2.3 operation results
Run the command java -jar build/libs/consoleapplication-0.0.1-SNAPSHOT.jar -non1 non2 --option=1, and the result is:
2019-03-16 18:08:08.528 INFO 19778 --- [ main] c.e.consoleapplication.DemoApplication : No active profile set, falling back to default profiles: default 2019-03-16 18:08:09.166 INFO 19778 --- [ main] c.e.consoleapplication.DemoApplication : Started DemoApplication in 16.059 seconds (JVM running for 16.56) test option arg names[option] non option+[-non1, non2]-non1 non2 --option=1 test%
As you can see, the optional parameter name has option, and the non optional parameters have - non1 and non2
3. summary
Both CommandLineRunner and ApplicationRunner can achieve special logic by obtaining the values we need according to the parameters when the command-line application is started. However, they are different. It is recommended to use the optional parameter of ApplicationRunner to facilitate extension.