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:
- Configuración global de Devtools.
- Parámetros definidos con la anotación
@TestPropertySourceen pruebas unitarias. - Parámetros definidos con la anotación
@SpringBootTesten pruebas unitarias. - Argumentos de línea de comandos (por ejemplo,
java -jar aplicacion.jar --propiedad="valor"). - Parámetros de SPRING_APPLICATION_JSON en la línea de comandos (por ejemplo,
java -Dspring.application.json='{"propiedad":"valor"}' -jar aplicacion.jar). - Parámetros de inicialización de ServletConfig.
- Parámetros de inicialización de ServletContext.
- Parámetros JNDI (por ejemplo,
java:comp/env/spring.application.json). - Parámetros del sistema Java (de
System.getProperties()). - Variables de entorno del sistema operaitvo.
- Fuente de propiedades aleatoria RandomValuePropertySource, solo para claves que coincidan con
random.*. - Archivos de configuración fuera del JAR (
application-{perfil}.propertieso YAML). - Archivos de configuración dentro del JAR (
application-{perfil}.propertieso YAML). - Archivos de configuración fuera del JAR (
application.propertieso YAML). - Archivos de configuración dentro del JAR (
application.propertieso YAML). - Parámetros cargados por anotaciones
@PropertySourceen clases@Configuration. - 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.