La anotación @ConditionalOnProperty en Spring Boot se utiliza para habilitar o deshabilitar automáticamente componentes, beans o configuraciones en función del valor de una propiedad especificada en los archivos de configuración (application.properties o application.yml). Es una herramienta muy útil para realizar configuraciones condicionales basadas en el entorno, habilitar características opcionales, o gestionar configuraciones personalizadas según el estado de propiedades.
@ConditionalOnProperty es una anotación que forma parte del paquete org.springframework.boot.autoconfigure.condition y se utiliza para controlar la creación de beans y la ejecución de configuraciones en Spring Boot según el valor de una propiedad. Permite definir condiciones basadas en propiedades de configuración, como application.properties o variables de entorno.
prefix: Especifica el prefijo de la propiedad, lo que ayuda a agrupar configuraciones.
name: Define el nombre específico de la propiedad.
havingValue: Indica el valor que debe tener la propiedad para que el bean se habilite (por defecto, se activa si la propiedad está presente y no es false).
matchIfMissing: Si se establece en true, el bean se registra incluso si la propiedad no está presente (valor predeterminado: false).
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
@ConditionalOnProperty(name = "mi.feature.habilitada", havingValue = "true")
public MiServicio miServicio() {
return new MiServicio();
}
}
En este ejemplo:
MiServicio solo se creará si la propiedad mi.feature.habilitada está definida en application.properties con el valor true:
mi.feature.habilitada=true
false) o no está presente, el bean no se registrará en el contexto de Spring.
prefix y name
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ServicioConfig {
@Bean
@ConditionalOnProperty(prefix = "mi.aplicacion", name = "modo", havingValue = "produccion")
public ServicioProduccion servicioProduccion() {
return new ServicioProduccion();
}
@Bean
@ConditionalOnProperty(prefix = "mi.aplicacion", name = "modo", havingValue = "desarrollo")
public ServicioDesarrollo servicioDesarrollo() {
return new ServicioDesarrollo();
}
}
En este caso:
prefix = "mi.aplicacion" para agrupar las propiedades.
mi.aplicacion.modo=produccion, se registra el bean ServicioProduccion.
mi.aplicacion.modo=desarrollo, se activa ServicioDesarrollo.
producción o desarrollo).
matchIfMissing
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConfiguracionDefecto {
@Bean
@ConditionalOnProperty(name = "mi.configuracion.personalizada", havingValue = "true", matchIfMissing = true)
public ConfiguracionDefectoBean configuracionPorDefecto() {
return new ConfiguracionDefectoBean();
}
}
En este ejemplo:
ConfiguracionDefectoBean se habilita si mi.configuracion.personalizada=true.
mi.configuracion.personalizada no está definida, gracias a matchIfMissing = true.
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnProperty(name = "feature.nueva", havingValue = "enabled")
public class NuevaFeatureConfig {
// Definir beans o configuraciones adicionales para esta característica
}
En este caso:
NuevaFeatureConfig y sus definiciones de beans se cargarán solo si la propiedad feature.nueva está establecida como enabled:
feature.nueva=enabled
Puedes combinar @ConditionalOnProperty con otras anotaciones condicionales como @ConditionalOnClass, @ConditionalOnMissingBean, y @ConditionalOnBean para crear configuraciones más complejas:
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConfiguracionCombinada {
@Bean
@ConditionalOnProperty(name = "feature.combinada", havingValue = "true")
@ConditionalOnBean(MiServicio.class) // Este bean solo se crea si existe MiServicio
public ServicioCombinado servicioCombinado() {
return new ServicioCombinado();
}
}
En este ejemplo:
servicioCombinado solo se creará si feature.combinada=true y MiServicio ya está definido como un bean en el contexto de Spring.
Se debe usar @ConditionalOnProperty cuando:
1. Deseas activar o desactivar configuraciones según el entorno (por ejemplo, desarrollo o producción).
2. Quieres habilitar características opcionales basadas en valores definidos en los archivos de configuración.
3. Necesitas crear beans de prueba que se habilitan solo en ciertos contextos.
4. Quieres establecer configuraciones predeterminadas en caso de que una propiedad esté ausente (matchIfMissing = true).
Para obtener más detalles sobre @ConditionalOnProperty, consulta la documentación oficial de Spring.
Jorge García
Fullstack developer