Spring Boot runs all the CommandLineRunner
or ApplicationRunner
beans from the application context. You cannot select one by any args.
So basically you have two possibiities:
- You have different
CommandLineRunner
implementations and in each you check the arguments to determine if this special CommandLineRunner
should run.
- You implement only one
CommandLineRunner
which acts as a dispatcher. Code might look something like this:
This is the new Interface that your runners will implement:
public interface MyCommandLineRunner {
void run(String... strings) throws Exception;
}
You then define implementations and identify them with a name:
@Component("one")
public class MyCommandLineRunnerOne implements MyCommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(MyCommandLineRunnerOne.class);
@Override
public void run(String... strings) throws Exception {
log.info("running");
}
}
and
@Component("two")
public class MyCommandLineRunnerTwo implements MyCommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(MyCommandLineRunnerTwo.class);
@Override
public void run(String... strings) throws Exception {
log.info("running");
}
}
Then in your single CommandLineRunner
implementation you get hold of the application context and resolve the required bean by name, my example uses just the first argument, and call it's MyCommandLineRunner.run()
method:
@Component
public class CommandLineRunnerImpl implements CommandLineRunner, ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void run(String... strings) throws Exception {
if (strings.length < 1) {
throw new IllegalArgumentException("no args given");
}
String name = strings[0];
final MyCommandLineRunner myCommandLineRunner = applicationContext.getBean(name, MyCommandLineRunner.class);
myCommandLineRunner.run(strings);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
}