En el ecosistema de Spring, leer propiedades del archivo de confgiuración application.yml es una tarea habitual. A continuación se detallan tres efnoques comunes para lograrlo.
Primer enfoque: Inyección mediante la anotación @Value
Este método utiliza la anotación @Value para asignar valores directamente a campos de la aplicación.
Sintaxis básica
@Value("${clave.en.yml:valor.por.defecto}")
@Value("${clave.en.yml}")
Implementación directa en una clase
import org.springframework.beans.factory.annotation.Value;
public class ServicioEjemplo {
@Value("${app.entorno.nombre}")
private String entornoActual;
@Value("${app.tiempo.espera:5000}")
private long tiempoEspera;
public void mostrarConfiguracion() {
System.out.println("Entorno: " + entornoActual);
System.out.println("Timeout configurado: " + tiempoEspera);
}
}
Uso dentro de una clase de configuración con @Bean
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConfiguracionEntorno {
@Value("${app.sistema.regional}")
private String region;
@Value("${app.sistema.idioma}")
private String idioma;
@Bean
public ConfigSistema crearConfigSistema() {
ConfigSistema config = new ConfigSistema();
config.setRegion(region);
config.setIdioma(idioma);
return config;
}
}
Segundo enfoque: Vinculación con @ConfigurationProperties
Esta estrategia enlaza un bloque de propiedades del YAML a un POJO, facilitando su gestión.
Puntos clave a considerar:
- La clase debe anotarse con
@Configurationy@ConfigurationProperties. - Es necesario proveer métodos de acceso (getters y setters) para cada propiedad.
- La inyección puede no funcionar correctamente en ciertos beans como controladores; se recomienda su uso en servicios o componentes de lógica.
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationProperties(prefix = "app.base.datos")
public class ConfiguracionBaseDatos {
private String rutaConexion;
private String usuario;
private String clave;
public String getRutaConexion() {
return rutaConexion;
}
public void setRutaConexion(String rutaConexion) {
this.rutaConexion = rutaConexion;
}
public String getUsuario() {
return usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
public String getClave() {
return clave;
}
public void setClave(String clave) {
this.clave = clave;
}
}
Tercer enfoque: Consulta mediante Environment
El objeto Environment actúa como un contenedor centralizado para todas las propiedades del contexto de Spring.
import org.springframework.core.env.Environment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class LectorPropiedades {
@Autowired
private Environment entorno;
public void verificarPropiedades() {
String puerto = entorno.getProperty("app.puerto", "8080");
String nombreApp = entorno.getProperty("app.nombre");
System.out.println("Puerto activo: " + puerto);
System.out.println("Nombre de la aplicación: " + nombreApp);
}
}