ApplicationRunner is an interface provided by Spring Boot that allows developers to execute custom startup logic immediately after the Spring Boot application starts successfully.
It is mainly used to run initialization tasks, load default data, validate configurations, execute startup scripts, and process application arguments during application startup.
ApplicationRunner is very similar to CommandLineRunner, but it provides a more advanced and structured way of handling startup arguments.
Why is ApplicationRunner Used?
In real-world Spring Boot applications, developers often need to execute some logic automatically when the application starts.
Examples include:
- Loading default data into the database
- Creating admin users and roles
- Initializing cache data
- Checking third-party API connections
- Validating environment variables
- Reading startup arguments
- Executing startup reports
- Sending startup notifications
ApplicationRunner helps automate these tasks efficiently.
How ApplicationRunner Works Internally
During Spring Boot startup:
- Spring Boot initializes the application context
- All beans are created and dependencies are injected
- The embedded server starts
- Spring Boot searches for ApplicationRunner beans
- The
run()method executes automatically
This means ApplicationRunner runs only after the entire application is fully ready.
ApplicationRunner Interface
The ApplicationRunner interface belongs to:
org.springframework.boot.ApplicationRunner
It contains the following method:
void run(ApplicationArguments args) throws Exception;
Basic Example of ApplicationRunner
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class StartupRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("Spring Boot Application Started");
System.out.println("Executing startup logic...");
}
}
Output
Spring Boot Application Started
Executing startup logic...
Real-Time Example in E-Commerce Application
Suppose you are building an e-commerce platform using Spring Boot.
When the application starts, you may want to:
- Load product categories
- Create default admin accounts
- Validate payment gateway configuration
- Initialize inventory cache
- Connect to external shipping APIs
ApplicationRunner can perform these startup tasks automatically.
@Component
public class EcommerceStartupRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("Loading product categories...");
System.out.println("Initializing payment gateway...");
System.out.println("Startup tasks completed...");
}
}
Understanding ApplicationArguments
The main advantage of ApplicationRunner is the use of
ApplicationArguments.
It provides advanced methods to access startup arguments in a structured way.
Features of ApplicationArguments
- Read option arguments
- Read non-option arguments
- Check whether an argument exists
- Get argument values easily
Example: Reading Startup Arguments
@Component
public class ArgumentRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("Source Arguments:");
for(String arg : args.getSourceArgs()) {
System.out.println(arg);
}
}
}
Running the Application with Arguments
java -jar app.jar --name=Naresh --course=SpringBoot
Output
--name=Naresh
--course=SpringBoot
Reading Specific Option Arguments
@Component
public class UserRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
if(args.containsOption("name")) {
String name = args.getOptionValues("name").get(0);
System.out.println("User Name: " + name);
}
}
}
Output
User Name: Naresh
Reading Non-Option Arguments
Non-option arguments are arguments without --.
Example
@Component
public class NonOptionRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println(args.getNonOptionArgs());
}
}
Running Application
java -jar app.jar java spring mysql
Output
[java, spring, mysql]
Using Multiple ApplicationRunner Implementations
A Spring Boot application can contain multiple ApplicationRunner beans.
Spring Boot automatically executes all ApplicationRunner implementations during startup.
Example
@Component
public class FirstRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("First Runner Executed");
}
}
@Component
public class SecondRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("Second Runner Executed");
}
}
Controlling Execution Order
Execution order can be controlled using the @Order annotation.
Example
@Component
@Order(1)
public class FirstRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("Executed First");
}
}
@Component
@Order(2)
public class SecondRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) {
System.out.println("Executed Second");
}
}
Output
Executed First
Executed Second
Difference Between ApplicationRunner and CommandLineRunner
| Feature | ApplicationRunner | CommandLineRunner |
|---|---|---|
| Arguments Type | ApplicationArguments | String[] args |
| Argument Parsing | Advanced | Basic |
| Best For | Complex startup arguments | Simple startup tasks |
| Option Argument Support | Yes | Manual parsing required |
ApplicationRunner vs @PostConstruct
| Feature | ApplicationRunner | @PostConstruct |
|---|---|---|
| Runs After Application Startup | Yes | No |
| Application Context Fully Ready | Yes | Not Always |
| Supports Startup Arguments | Yes | No |
| Primary Usage | Startup logic | Bean initialization |
Advantages of ApplicationRunner
- Executes startup logic automatically
- Provides structured argument handling
- Easy to implement
- Useful for enterprise startup tasks
- Improves automation during application startup
- Works well with Spring Boot lifecycle
- Supports complex startup argument parsing
Disadvantages of ApplicationRunner
- Heavy processing can slow startup time
- Improper logic may fail application startup
- Multiple runners may create dependency issues
- Not suitable for long-running background tasks
Best Practices for Using ApplicationRunner
- Keep startup logic lightweight
- Use services instead of writing all logic directly inside run()
- Handle exceptions properly
- Use @Order for multiple runners
- Do not perform heavy database operations unnecessarily
- Use transactions for startup database operations
- Log startup activities for monitoring and debugging
Production-Level Example
@Component
@Order(1)
public class StartupValidator implements ApplicationRunner {
private final PaymentService paymentService;
public StartupValidator(PaymentService paymentService) {
this.paymentService = paymentService;
}
@Override
public void run(ApplicationArguments args) {
paymentService.validateGateway();
System.out.println("Payment gateway validated successfully");
}
}
In enterprise applications, ApplicationRunner is commonly used for:
- Microservice startup validation
- Security initialization
- Environment checks
- Cache initialization
- Database migration verification
- API connectivity testing
- Default configuration loading
Common Interview Questions on ApplicationRunner
What is ApplicationRunner in Spring Boot?
ApplicationRunner is a Spring Boot interface used to execute custom startup logic after the application context is fully initialized.
What is the advantage of ApplicationRunner over CommandLineRunner?
ApplicationRunner provides ApplicationArguments, which allows structured and advanced startup argument handling.
Can multiple ApplicationRunner implementations exist?
Yes. Multiple ApplicationRunner beans can exist, and execution order can be managed using the @Order annotation.
When does ApplicationRunner execute?
It executes immediately after the Spring Boot application starts successfully.
Can ApplicationRunner be used in production applications?
Yes. It is widely used in enterprise applications for startup validation, data loading, initialization, and configuration tasks.
Conclusion
ApplicationRunner is a powerful Spring Boot startup interface used to execute custom logic after the application starts successfully.
It is especially useful when developers need advanced argument handling during startup. Compared to CommandLineRunner, ApplicationRunner provides cleaner and more structured access to startup arguments.
It is commonly used in real-world enterprise applications for startup validation, cache loading, database initialization, environment verification, and microservice setup.
Understanding ApplicationRunner is important for Spring Boot developers because it is frequently used in production systems and technical interviews.