Spring Boot externaliza la configuración en ficheros de propiedades, variables de entorno o argumentos de línea de comandos. El objetivo: el mismo artefacto (JAR) funciona en cualquier entorno cambiando solo la configuración.
# application.yml
server:
port: 8080
spring:
datasource:
url: jdbc:postgresql://localhost:5432/midb
username: ${DB_USER}
password: ${DB_PASS}
app:
config:
timeout: 30
retry-count: 3Fuentes de configuración por orden de precedencia (mayor a menor):
- Argumentos de línea de comandos (
--server.port=9090) - Variables de entorno (
SPRING_DATASOURCE_URL) application-{profile}.propertiesapplication.properties/application.yml- Valores por defecto en
@Value
@Value vs @ConfigurationProperties:
// @Value — propiedad individual
@Value("${app.config.timeout}")
private int timeout;
// @ConfigurationProperties — grupo de propiedades (recomendado)
@ConfigurationProperties(prefix = "app.config")
@Component
public class AppConfig {
private int timeout;
private int retryCount; // app.config.retry-count → camelCase automático
// getters y setters...
}@ConfigurationProperties es preferible para grupos de propiedades: validación con @Validated, autocompletado en IDEs y mapeo tipo-seguro.
- Configuración sin recompilar: cambia el entorno cambiando propiedades.
@ConfigurationPropertiescon validación (@NotNull,@Min) para configuración robusta.- Variables de entorno y CLI args tienen mayor precedencia — útil para override en producción.
- Spring Cloud Config y Vault para configuración centralizada y secreta en microservicios.
Ver ExpConfig.java, ExpPropertiesBinding.java, ExpEnvironment.java y ExpValidation.java para ejemplos ejecutables con @ConfigurationProperties, @Value, validación y fuentes de configuración por precedencia.