En ocaciones necesitamos crear diferentes tipos de Beans dependiendo de una ciertas condiciones. Supongamos que tenemos un sistema en que tenemos envios de notificaciones y algunos clientes de ese sistema prefieren que las notificaciones sean por email y otros clientes prefieren que sean por sms. En este caso deberiamos inyectar un bean diferente para cada cliente.Para resolver este problema nos podemos ayudar de la anotacion @ConditionalOnProperty en Spring Boot.
¿Que es @ConditionalOnProperty en Spring Boot?
@ConditionalOnProperty puede leer propiedades de Spring Boot y con base en su valor determinaar si el Bean se creara o no. Esto puede ser util para solventar el problema presentado en el parrafo anterior o por ejemplo si queremos usar un Bean diferente para el ambiente dev y prod.
¿Como funciona @ConditionalOnProperty en Spring Boot?
El funcionamiento de la anotacion es bastante intuitivo:
@ConditionalOnProperty(name = "", havingValue = "true")
En el atributo “name” ponemos la propiedad de cuyo valor dependera el la creación del Bean y el atributo “havingValue” determina el valor esperado para crear o no el Bean.
Ejemplo del uso de @ConditionalOnProperty en Spring Boot
Lo primero que debemos de hacer es crear una la propiedad en el archivo application yml.
Ahora podemos crear una Interfaz y dos clases que hereden de esta interfaz.
En el codigo anterior podemos ver como implementamos el metodo sendMessage solo con un log solo para efectos del ejemplo de @ConditionalOnProperty en un caso real esto podria ser un llamado al algun API.
En la anotacion @ConditionalOnProperty podemos ver la referencia al nombre de la propiedad que escribimos en el archivo application yml.
Ahora nos queda probar el codigo:
Obtendremos una salida como esta:
Start
Sending SMS message: Any Text
Finish
Podemos ver que obtivimos el llamado del metodo de la clase SmsMessageServiceImpl que fue el que configuramos en el archivo application.yml
¿Que aprendimos?
Ahora sabemos que @ConditionalOnProperty nos ayuda a crear beans basado en que se cumplan condiciones que podemos definir. Su uso nos permite adaptar nuestro codigo a diferentes entornos brindandonos asi una mayor flexibilidad en comportamiento de nuestra aplicación.