Orden de Carga de Configuración en Spring Boot

Al desarrollar aplicaciones con Spring Boot, es común manejar configuraciones para distintos entornos como desarrollo, pruebas y producción. Spring Boot facilita el uso del mismo código base con configuraciones diferentes.

Las configuraciones se pueden cargar mediante archivos properties, YAML, variables de entorno del sistema, argumentos de línea de comandos y otros mecanismos.

Para utilizar estas configuraciones en los beans de Spring, se emplean anotaciones como @Value para inyectar valores individuales desde el Environment, @ConfigurationProperties para enlazar propiedades a un objeto, o accediendo directamente al Environment inyectado.

Spring Boot gestiona las configuraciones a través de fuentes de propiedades que permiten sobrescribir valores. El orden de carga determina la prioridad, con los primeros elementos teniendo mayor precedencia. A continuación, se detalla la secuencia basada en Spring Boot 2.0:

  1. Configuración global de Devtools.
  2. Parámetros definidos con la anotación @TestPropertySource en pruebas unitarias.
  3. Parámetros definidos con la anotación @SpringBootTest en pruebas unitarias.
  4. Argumentos de línea de comandos (por ejemplo, java -jar aplicacion.jar --propiedad="valor").
  5. Parámetros de SPRING_APPLICATION_JSON en la línea de comandos (por ejemplo, java -Dspring.application.json='{"propiedad":"valor"}' -jar aplicacion.jar).
  6. Parámetros de inicialización de ServletConfig.
  7. Parámetros de inicialización de ServletContext.
  8. Parámetros JNDI (por ejemplo, java:comp/env/spring.application.json).
  9. Parámetros del sistema Java (de System.getProperties()).
  10. Variables de entorno del sistema operaitvo.
  11. Fuente de propiedades aleatoria RandomValuePropertySource, solo para claves que coincidan con random.*.
  12. Archivos de configuración fuera del JAR (application-{perfil}.properties o YAML).
  13. Archivos de configuración dentro del JAR (application-{perfil}.properties o YAML).
  14. Archivos de configuración fuera del JAR (application.properties o YAML).
  15. Archivos de configuración dentro del JAR (application.properties o YAML).
  16. Parámetros cargados por anotaciones @PropertySource en clases @Configuration.
  17. Parámetros predeterminados (establecidos con SpringApplication.setDefaultProperties).

Para demostrar este orden, realicemos un ejemplo práctico. Primero, establezcamos una propiedad del sistema en la aplicación:


@Bean
public CommandLineRunner initCommandLine() {
    return args -> {
        System.setProperty("app.title", "titulo-del-sistema");
    };
}

Segundo, definamos una propiedad en el archivo application.properties:


app.title = titulo-de-la-aplicacion

Tercero, definamos una propiedad en el archivo application-dev.properties:


app.title = titulo-de-la-aplicacion-dev

Finalmente, creemos una clase de prueba:


@RunWith(SpringRunner.class)
@SpringBootTest(properties = {"app.title=titulo-de-prueba", "genero=1"})
@ActiveProfiles("dev")
public class PruebaSpringBoot {

    @Value("${app.title}")
    private String titulo;

    @Test
    public void testTitulo() {
        System.out.println("El titulo es: " + titulo);
    }
}

Al ejecutar la prueba, la salida será:


El titulo es: titulo-de-prueba

Al ajustar dinámicamente los parámetros, se verifica que los valores se sobrescriben correctamente según el orden de carga establecido.

Etiquetas: spring-boot configuracion java YAML propiedades

Publicado el 6-5 05:46