Si alguna vez te han preguntado en una entrevista sobre Spring Boot es probable que te hayan planteado esta cuestión clave sobre la inyección de propiedades con @Value: ¿dónde busca Spring Boot el valor de @Value(${my.property:DEFAULT_VALUE}) y en qué orden? A primera vista parece sencillo, pero la respuesta demuestra el conocimiento sobre cómo Spring Boot resuelve propiedades de configuración, algo que afecta directamente al comportamiento de las aplicaciones en distintos entornos.
Qué hace la anotación @Value
La anotación @Value permite inyectar valores en campos desde fuentes de configuración como application.properties, application.yml, variables de entorno, parámetros de línea de comandos o valores por defecto. Un ejemplo práctico sin usar comillas en la expresión sería @Value(${my.property:DEFAULT_VALUE}) private String myProperty; En ese ejemplo my.property es la clave que Spring Boot intentará resolver y DEFAULT_VALUE es el valor de reserva que se usa si no se encuentra la propiedad en ninguna fuente. Este mecanismo evita que la aplicación falle al arrancar por falta de configuración y es muy útil para pequeñas inyecciones puntuales. Para configuraciones más grandes o agrupadas suele recomendarse el uso de @ConfigurationProperties.
Orden de resolución de propiedades en Spring Boot
Spring Boot busca la clave en varias fuentes y respeta un orden de prioridad. La primera fuente que aporta un valor válido será la utilizada. El orden general es el siguiente en orden descendente de prioridad: 1) argumentos de línea de comandos como --my.property=value 2) propiedades del sistema Java como -Dmy.property=value 3) variables de entorno del sistema como MY_PROPERTY=value 4) archivos application.properties o application.yml dentro del JAR 5) archivos de perfil específicos como application-dev.properties cuando spring.profiles.active=dev 6) archivos de configuración externos en un directorio /config fuera del JAR 7) atributos JNDI en entornos de servidor 8) valores aleatorios generados por Spring Boot como ${random.uuid} 9) valor por defecto definido en el código con @Value(${my.property:default})
Este orden permite sobreescribir valores sin cambiar el código, por ejemplo mediante variables de entorno o argumentos al arrancar la aplicación, lo cual es esencial para desplegar el mismo artefacto en desarrollo, staging y producción.
Ejemplo práctico
Imagina una estructura simple src/main/resources con application.properties y application-dev.properties. En application.properties tienes my.property=HelloFromApplication y en application-dev.properties my.property=HelloFromDevProfile. En tu clase usas @Value(${my.property:DefaultHello}) private String message; Casos al ejecutar la aplicación: al ejecutar java -jar myapp.jar sin perfil activo Spring Boot carga application.properties y message vale HelloFromApplication; al ejecutar java -jar myapp.jar --spring.profiles.active=dev se prioriza application-dev.properties y message vale HelloFromDevProfile; al ejecutar java -jar myapp.jar --my.property=HelloFromCLI los argumentos de línea de comandos tienen máxima prioridad y message vale HelloFromCLI; si la propiedad no existe en ninguna fuente se usa el valor por defecto DefaultHello.
Errores comunes
1 Olvidar activar el perfil correspondiente hace que los archivos application-dev.properties o application-prod.properties no se carguen y se use application.properties por defecto. 2 Sobrescrituras no intencionadas: una variable de entorno o un argumento de sistema puede reemplazar una propiedad definida en archivos .properties, por ejemplo la variable MY_PROPERTY puede sobrescribir my.property. 3 Confundir @Value y @ConfigurationProperties: @Value es idóneo para valores puntuales, @ConfigurationProperties para grupos de propiedades con tipado fuerte y validación. Usar la herramienta adecuada mantiene la configuración ordenada y mantenible.
Consejo para entrevistas y resumen
Al responder en una entrevista menciona que Spring Boot fusiona múltiples fuentes de configuración y que las fuentes con mayor prioridad como argumentos de línea de comandos o variables de entorno pueden reemplazar valores en archivos de configuración. Destaca que @Value(${my.property:DEFAULT}) ofrece una red de seguridad al proporcionar un valor por defecto. Un nemotécnico sencillo para recordar el orden es CLI ? System ? Env ? App ? Default, es decir argumentos de línea de comandos, propiedades del sistema, variables de entorno, archivos de aplicación y finalmente el valor por defecto en código.
Preguntas frecuentes
1 Qué ocurre si falta una propiedad y no hay valor por defecto En ese caso Spring lanzará una excepción durante el arranque indicando que no se pudo resolver el placeholder, por ejemplo java.lang.IllegalArgumentException Could not resolve placeholder my.property. Para evitarlo siempre proporciona un valor por defecto en la expresión @Value o asegura la presencia de la propiedad en las fuentes de configuración. 2 En qué se diferencia @ConfigurationProperties de @Value @ConfigurationProperties agrupa y enlaza múltiples propiedades con tipado fuerte y validación, ideal para configuraciones complejas o relacionadas; @Value es mejor para inyecciones puntuales y rápidas. 3 Se pueden sobrescribir propiedades en tiempo de ejecución Sí, mediante argumentos de línea de comandos, variables de entorno o propiedades del sistema; en entornos cloud y pipelines CI CD esto es habitual.
Sobre Q2BSTUDIO y servicios relacionados
En Q2BSTUDIO somos una empresa de desarrollo de software especializada en aplicaciones a medida y software a medida, con experiencia en inteligencia artificial, ciberseguridad y servicios cloud aws y azure. Creamos soluciones robustas que aplican buenas prácticas de configuración como las descritas en este artículo para garantizar despliegues previsibles entre entornos. Si buscas desarrollar una aplicación a medida o una solución empresarial con integración de IA y agentes IA consulta nuestras capacidades en desarrollo de aplicaciones y software multicanal y descubre cómo integrar inteligencia artificial en tus proyectos en servicios de inteligencia artificial para empresas. Además ofrecemos ciberseguridad y pentesting, servicios inteligencia de negocio y Power BI, así como automatización de procesos para optimizar operaciones.
Palabras clave
Aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi.
Si quieres que revisemos la configuración de propiedades de tu aplicación Spring Boot o que diseñemos una arquitectura segura y escalable para tus servicios cloud contacta con Q2BSTUDIO y llevemos tu proyecto al siguiente nivel.