CommandLineRunner y ApplicationRunner son dos interfaces proporcionadas por Spring Boot que permiten ejecutar código específico después de que la aplicación se ha iniciado completamente. La principal diferencia entre ellas radica en cómo manejan los argumentos de línea de comandos. A continuación se presenta una descripción detallada de ambas interfaces:
- CommandLineRunner ====================
Definición
CommandLineRunner es una interfaz sencilla que define un método run, el cual se ejecuta una vez que el contexto de la aplicación Spring se ha cargado por completo. Recibe como entrada un array de argumentos de línea de comandos en formato String... args.
Definición de la interfaz
public interface CommandLineRunner {
void run(String... args) throws Exception;
}
Características
- Simplicidad de uso: Recibe directamente un array de argumentos de línea de comandos en bruto.
- Casos de uso adecuados: Ideal para tareas de inicialización simples, como registrar logs o cargar datos iniciales.
Ejemplo de uso
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class InicializadorSimple implements CommandLineRunner {
@Override
public void run(String... argumentos) throws Exception {
System.out.println("InicializadorSimple: ¡La aplicación ha arrancado con éxito!");
System.out.println("Argumentos recibidos: " + String.join(", ", argumentos));
}
}
Resultado de ejecución
Si se inicia la aplicación con argumentos de línea de comandos como --parametro1 valor1 --parametro2 valor2, la salida será:
InicializadorSimple: ¡La aplicación ha arrancado con éxito!
Argumentos recibidos: --parametro1, valor1, --parametro2, valor2
- ApplicationRunner ====================
Definición
ApplicationRunner es una interfaz más avanzada que también define un método run, pero ofrece funcionalidades más ricas en el procesamiento de argumentos. Recibe un objeto ApplicationArguments que permite un manejo más flexible de los parámetros.
Definición de la interfaz
public interface ApplicationRunner {
void run(ApplicationArguments args) throws Exception;
}
Características
- Funcionalidad robusta: A través de
ApplicationArgumentsproporciona un análisis flexible de los argumentos de línea de comandos, incluyendo la obtención de opciones y parámetros no opcionales. - Casos de uso adecuados: Ideal para escenarios que requieren un análisis complejo de argumentos de línea de comandos.
Ejemplo de uso
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class ProcesadorParametros implements ApplicationRunner {
@Override
public void run(ApplicationArguments parametros) throws Exception {
System.out.println("ProcesadorParametros: ¡La aplicación está lista para operar!");
// Obtener parámetros no opcionales
List<String> argsNoOpcionales = parametros.getNonOptionArgs();
System.out.println("Parámetros no opcionales: " + argsNoOpcionales);
// Obtener parámetros opcionales
Set<String> nombresOpciones = parametros.getOptionNames();
System.out.println("Parámetros opcionales: " + nombresOpciones);
for (String opcion : nombresOpciones) {
List<String> valores = parametros.getOptionValues(opcion);
System.out.println("Valores para la opción " + opcion + ": " + valores);
}
}
}
Resultado de ejecución
Si se inicia la aplicación con argumentos de línea de comandos --parametro1 valor1 --parametro2 valor2, la salida será:
ProcesadorParametros: ¡La aplicación está lista para operar!
Parámetros no opcionales: []
Parámetros opcionales: [parametro1, parametro2]
Valores para la opcion parametro1: [valor1]
Valores para la opcion parametro2: [valor2]
- Comparación =====
| CommandLineRunner | ApplicationRunner | |
|---|---|---|
| Definición de interfaz | void run(String... args) |
void run(ApplicationArguments args) |
| Manejo de parámetros | Array de argumentos de línea de comandos en bruto String... args |
Proporciona objeto ApplicationArguments con soporte para análisis complejo |
| Casos de uso | Tareas simples, como logging o carga de datos iniciales | Escenarios que requieren análisis complejo de argumentos de línea de comandos |
| Flexibilidad | Baja, adecuada para necesidades simples | Alta, adecuada para necesidades complejas |
- Conclusión =====
- Si tu tarea solo requiere un procesamiento básico de argumentos de línea de comandos, utiliza
**CommandLineRunner**. - Si necesitas realizar un análisis complejo de los argumentos (como separar opciones y parámetros no opcionales), se recomienda usar
**ApplicationRunner**.
En el desarrollo real, puedes seleccionar la interfaz adecuada según tus requisitos, e incluso puedes utilizar ambas en el mismo proyecto simultáneamente.