
The Spring Command Line Runner is a powerful tool that allows you to run beans as standalone applications from the command line.
It's a great way to run tasks or commands that don't require a web application context.
The Spring Command Line Runner is essentially a type of bean that can be defined in your application's configuration class.
This bean is annotated with the @EnableAutoConfiguration annotation, which enables auto-configuration of the application.
The CommandLineRunner interface is implemented by the bean to specify the command to be executed.
In the application's main configuration class, you can define a @Bean of type CommandLineRunner.
This bean is responsible for executing the command when the application starts.
The @EnableAutoConfiguration annotation is used to enable auto-configuration of the application.
Auto-configuration is a process where Spring automatically configures the application based on the dependencies declared in the project.
You might like: Maze Runner
In the example, the @EnableAutoConfiguration annotation is used to enable auto-configuration of the application.
The @Bean annotation is used to define a bean of type CommandLineRunner.
The CommandLineRunner interface is implemented by the bean to specify the command to be executed.
The command to be executed is specified by the run() method of the CommandLineRunner interface.
The run() method is where you put the code that needs to be executed when the application starts.
In the example, the run() method is used to execute a command that prints a message to the console.
The command to be executed is specified by the run() method of the CommandLineRunner interface.
The CommandLineRunner interface is designed to be used in conjunction with the @EnableAutoConfiguration annotation.
Auto-configuration is a process where Spring automatically configures the application based on the dependencies declared in the project.
In the example, the @EnableAutoConfiguration annotation is used to enable auto-configuration of the application.
Expand your knowledge: Azure Run Command
ApplicationRunner Basics
ApplicationRunner is an interface in Spring Boot that provides a slightly different signature for the run method compared to CommandLineRunner. It wraps the input arguments into the ApplicationArguments object, which offers utility methods like getOptionNames() and getOptionValues(String name) for better argument parsing.
This interface is a sibling to CommandLineRunner and serves a similar purpose, but with a more flexible way of handling command-line arguments. The run method in ApplicationRunner is invoked just after the Spring application context is initialized, allowing developers to perform initialization tasks or execute startup scripts.
To test the ApplicationRunner, you can implement it in a class and register it as a bean in a @Configuration class. This will enable you to interact with repositories, services, and other components seamlessly.
ApplicationRunner Work
ApplicationRunner works by providing command-line arguments in an ApplicationArguments object, which gives more convenient methods for accessing options and non-options arguments. This makes it easier to process command-line options when the application starts.
For example, you can use ApplicationArguments to check if a specific option, like --runTask, is present. If the option exists, you can trigger a background task using a reactive task service.
Here's a simple comparison of how CommandLineRunner and ApplicationRunner handle command-line arguments:
As you can see, ApplicationRunner provides a more convenient way to access and process command-line arguments. This makes it a great choice for applications that require complex startup logic.
Bean Detection and Registration
Spring Boot automatically detects beans that implement CommandLineRunner or ApplicationRunner during the component scanning phase. It identifies these beans based on their interface implementation.
Beans that implement CommandLineRunner or ApplicationRunner are instantiated, dependencies are injected, and configuration properties are loaded before they are executed. This phase occurs after the application context has been refreshed but before the application enters its steady operational state.
If multiple beans implement CommandLineRunner or ApplicationRunner, Spring determines their execution order using the Ordered interface or the @Order annotation. Beans without an explicit order execute in an undefined sequence.
The run methods of these interfaces are invoked after all beans within the application context are fully initialized and available for dependency injection. This allows CommandLineRunner and ApplicationRunner to interact with repositories, services, and other components seamlessly.
Any exceptions thrown during the execution of these runners propagate up the call stack and can halt the application. Developers must handle exceptions within the run methods to prevent unintended application termination.
Differences in Execution Flow
When using CommandLineRunner and ApplicationRunner, their execution flows differ due to how they handle command-line arguments.
CommandLineRunner directly accepts a String... args array, which requires manual parsing for structured inputs.
This can be a bit cumbersome, especially when dealing with complex inputs.
On the other hand, ApplicationRunner accepts an ApplicationArguments object that provides structured access to command-line arguments.
This abstraction streamlines argument handling and removes the need for manual parsing.
Here are some key differences in how you can access command-line arguments with ApplicationRunner:
- Non-option arguments are stored as raw strings and can be accessed via getNonOptionArgs().
- Option arguments are accessible as key-value pairs through methods like containsOption(String name) and getOptionValues(String name).
Spring Boot parses the raw String... args into this structured format before invoking the runner, introducing a minor overhead but allowing for more expressive argument handling.
Integration into the Lifecycle
The SpringApplication class serves as the central entry point for launching Spring Boot applications, and its run() method manages the lifecycle of these applications.
This includes scanning for runner beans, which are specifically CommandLineRunner and ApplicationRunner beans. These beans are populated into a list during the application context initialization phase.
The SpringApplication class maintains a list of all registered CommandLineRunner and ApplicationRunner beans. This list is populated during the application context initialization phase.
Once the application context is refreshed, the callRunners method of SpringApplication is responsible for invoking the runners. The method iterates through all registered CommandLineRunner and ApplicationRunner beans.
The callRunners method executes the run methods of these beans in the prescribed order. This order is determined by the Spring Boot framework.
Intriguing read: Azure Cli Commands List
Use Cases and Implementation
The CommandLineRunner interface is a powerful tool in Spring Boot that allows you to run code as soon as the application starts up. It's a great way to perform one-time tasks, configure the application based on command line arguments, and even schedule batch jobs.
You can implement the CommandLineRunner interface in three ways, including using it to parse command line arguments and configure the application accordingly. This is particularly useful when you need to set a default value for a configuration property if it's not provided as a command line argument.
Worth a look: Os Args Golang
One common use case for CommandLineRunner is to perform any one-time tasks that need to be run after the application has started, but before it is fully ready to handle requests. This could be initializing a database or loading data into the application.
You can access the arguments passed from the command line using the 'args' method argument. This is particularly useful when you need to configure the application based on command line arguments.
Here are some concrete use cases for CommandLineRunner:
- Need to add some additional logger information
- Schedule a batch job
- Database operation i.e. cleanup script, status update
Advanced Features
In Spring, you can take advantage of the command line runner feature to automate tasks and processes. One of the key benefits is the ability to integrate with external APIs or services to fetch configurations or synchronize data during startup.
The ApiService bean is a great example of this, as it interacts with an external API to fetch configuration data. This allows your application to adapt dynamically based on external inputs.
You can also cache or process the fetched data further, enabling your application to make informed decisions in real-time. For instance, you can use this feature to fetch user preferences from an external API and apply them to your application's settings.
Here are some ways you can leverage this feature:
- The ApiService bean interacts with an external API to fetch configuration data.
- The fetched data can be cached or processed further, enabling the application to adapt dynamically based on external inputs.
By integrating with external APIs or services, you can create more robust and dynamic applications that can respond to changing circumstances. This is especially useful for applications that need to fetch data from external sources or synchronize with other systems.
Implementation and Configuration
To implement a CommandLineRunner in Spring, you can use it to execute some database initialization when the application starts. This is achieved by using a reactive database client like R2DBC.
You can interact with external APIs or services to fetch configurations or synchronize data during startup. For example, the ApiService bean can interact with an external API to fetch configuration data.
The fetched data can be cached or processed further, enabling the application to adapt dynamically based on external inputs. This advanced logic integration allows for more complex scenarios, such as synchronizing data with external services.
Broaden your view: Line Information Database
Spring Boot CLI
Spring Boot CLI is a powerful tool that lets you execute code when your application starts. It's a great way to perform database initialization, like setting up default data.
You can use CommandLineRunner to initialize a database with default data, which is super helpful for development or testing environments. This allows your application to start with predefined records, providing a predictable state.
The mechanics of using CommandLineRunner involve accessing the UserRepository bean after the Spring context has fully initialized it. This ensures that the UserRepository bean and any underlying database connection pool are ready for interaction.
Here's a summary of the execution details:
- The runner checks if the database is empty and inserts records only when necessary.
- This execution phase guarantees that the UserRepository bean and any underlying database connection pool are ready for interaction.
Parsing Command-Line Arguments
Parsing command-line arguments is a crucial aspect of application development, and Spring Boot provides a convenient way to handle this using the ApplicationArguments object. This object is injected automatically by Spring, providing a clear separation between non-option and option arguments.
The ApplicationArguments object contains methods to check for the presence of specific options, such as containsOption, which checks for the presence of a specific key (e.g., --config). This makes it easy to respond dynamically to command-line inputs without manually processing raw strings.
Non-option arguments can be retrieved and printed directly, demonstrating how the application processes mixed input types. For example, the application can print all non-option arguments in a single string.
Here's a comparison of CommandLineRunner and ApplicationRunner:
As you can see from the comparison, ApplicationRunner is a more convenient choice when you need to distinguish between option and non-option arguments.
Environment-Specific Logic
You can conditionally execute logic based on the active environment by combining runners with Spring profiles.
Developers can segregate behavior between development, testing, and production environments using this technique.
The @Profile annotation restricts the execution of this runner to the dev profile.
During startup, Spring activates the dev profile only when explicitly specified via --spring.profiles.active=dev or through application configuration.
Here's a key point to remember: the runner executes its logic only when the profile is active, avoiding unintended behavior in other environments.
By using Spring profiles, you can ensure that your application behaves as expected in different environments.
You might enjoy: AWS App Runner
Implement Interface

Implementing the CommandLineRunner interface is a straightforward approach to execute custom logic when the Spring Boot application starts. You can implement this interface in the @SpringBootApplication annotated class, although it's not mandatory.
The CommandLineRunner interface is part of the org.springframework.boot package and has a single method, run(String... args). This method gets invoked after the Spring application context is loaded, providing the command-line arguments passed to the application as a String[].
If you have multiple implementations of the CommandLineRunner interface, Spring Boot scans all its run() methods and executes them by default. However, you can use the @Order annotation to force some ordering in them.
The CommandLineRunner interface is similar to the ApplicationRunner interface, but instead of receiving raw command-line arguments, it provides them in an ApplicationArguments object, giving more convenient methods for accessing options and non-options arguments.
To implement the CommandLineRunner interface, you'll need to create a class that implements the CommandLineRunner interface and overrides the run() method. Here's a simple example of how to do it:
Ordering and Testing
In a Spring Boot application, you can have multiple CommandLine Runners, but they need to be ordered using the @Order annotation. This ensures that they execute in a specific order.
You can use the @Order annotation to specify the order in which multiple CommandLine Runners should be executed. This is particularly useful when you have multiple tasks that need to be performed in a specific sequence.
The @Order annotation allows you to assign a specific order to each CommandLine Runner, making it easy to manage complex workflows. By specifying the order, you can ensure that your application behaves as expected.
For example, you can use the @Order annotation to specify the order in which multiple CommandLine Runners should be executed. This can be especially useful when testing your application.
In a testing scenario, you can use the @Order annotation to specify the order in which multiple CommandLine Runners should be executed. This allows you to test different scenarios and workflows with ease.
Example and Gotcha
Spring's CommandLineRunner can't distinguish between optional and non-optional arguments, treating them all as an array of strings.
This can lead to unexpected behavior, especially when working with command-line arguments. For example, the arguments -arg1=Jhooq and -arg2=CommanLineRunner are treated the same way.
Here's a breakdown of how CommandLineRunner handles arguments:
- -arg1=Jhooq
- -arg2=CommanLineRunner
- All are treated as Array of String.
To overcome this limitation, you can use the ApplicationRunner interface, which provides more flexibility when working with command-line arguments.
Example and Implementation
Let's explore a practical example of using CommandLineRunner to execute database initialization when the application starts.
The CommandLineRunner interface is frequently employed in scenarios where specific logic must execute after the Spring application context has been initialized.
We'll use a reactive database client like R2DBC to execute some database initialization.
In this example, we'll use CommandLineRunner to achieve the desired outcome.
The CommandLineRunner interface allows us to execute specific logic after the Spring application context has been initialized.
This is particularly useful for startup tasks, initialization procedures, or argument-based logic.
Testing and Unit Testing
Testing and unit testing are crucial when working with Spring's CommandLineRunner and ApplicationRunner. In a reactive environment, it's essential to test these components to ensure the proper execution of non-blocking code.
To write effective unit tests, you'll want to use mocking to isolate dependencies. For example, you can use Mockito to mock services like ReactiveDatabaseService and ReactiveTaskService.
Mocking allows you to test the execution of methods inside CommandLineRunner and ApplicationRunner without actually executing the services. This helps ensure that the methods execute the expected service calls.
Here's a brief overview of the testing process:
- Mocking: We use Mockito to mock services and their methods.
- Testing Execution: The goal is to ensure that methods execute the expected service calls.
- Verification: We use Mockito.verify() to ensure that mocked service methods were invoked correctly.
Ordering
In a Spring Boot Application Context, you can have multiple CommandLine Runner, but they must be executed in order.
The @Order annotation is used to specify the order of execution.
You can use the @Order annotation along with the CommandLine Runner to ensure that your runners are executed in the correct order.
In a typical scenario, you would use the @Order annotation to define the order of execution for your CommandLine Runners.
Unit Testing ApplicationRunner
Unit testing ApplicationRunner is crucial in a reactive environment, where non-blocking code execution can be tricky to verify. This is where Mockito comes in, allowing us to mock services like ReactiveDatabaseService and ReactiveTaskService, and their methods.
We use Mockito to create mock objects of these services, which enables us to test the execution of methods inside ApplicationRunner. The goal is to ensure that the expected service calls are made.
Here's how we can achieve this:
- Mocking: We use Mockito to mock the services (ReactiveDatabaseService and ReactiveTaskService) and their methods.
- Testing Execution: The goal of the tests is to ensure that the methods inside ApplicationRunner execute the expected service calls.
- Verification: We use Mockito.verify() to ensure that the mocked service methods were invoked correctly.
By using Mockito and verifying the execution of service calls, we can ensure that our ApplicationRunner is working as expected. This helps us catch any potential issues before they become major problems.
Frequently Asked Questions
What is the difference between Spring CommandLineRunner and ApplicationRunner?
The main difference between Spring CommandLineRunner and ApplicationRunner is that ApplicationRunner provides a more structured way to access and parse command-line arguments. This makes it a more organized and efficient choice for handling application startup tasks.
Featured Images: pexels.com


