Spring Boot Profiles (Perfiles)
Spring Boot Profiles nos permite configurar, parametrizar o mostrar información dependiendo del perfil (valga la redundancia) en que nosotros decidamos iniciar la aplicación.
Según tengo entendido no se puede cambiar de perfiles dinamicamente o en runtime.
De los casos mas conocidos esta configurar la aplicación por ambientes de ejecución como por ejemplo:
- Desarrollo
- Pruebas o QA
- Producción
Hay infinitos escenarios para utilizar Spring Boot Profiles, pero como ejemplo nos sirve para poder configurar a que base de datos queremos que se conecte nuestra aplicación.
Para este tutorial cambiaremos las url de conexión a base de datos dependiendo del perfil y les mostrare dos maneras de asignar el perfil para Spring Boot.
Basado en la imagen de arriba, hay que crear 3 archivos de properties en la carpeta src/main/resources:
- dev.properties
- qa.properties
- prod.properties.
Hay dos maneras de cargar archivos properties dependiendo del profile, en este tutorial podras ver como hacerlo con la anotacion @Profile, pero en el video que hay al final incluire el ejemplo de convecion sobre configuracion de Spring Boot.
Spring Boot Profiles usando @Profile
El proyecto tendrá la misma estructura del proyecto que hay en el video del tutorial anterior (Tutorial Spring Boot Properties). La diferencia es que en vez de un archivo de configuración para el properties source vamos a crear uno por cada ambiente:
- PropertiesSourceDev.java
- PropertiesSourceQa.java
- PropertiesSourceProd.java
Estructura de proyecto
Hasta este punto deberías de tener algo similar a esto
Como pudieron ver en el tutorial anterior se anota el archivo java “PropertiesSource.java” con la anotacion @Configuracion y @PropertySource.
Para definir el Spring Boot Profile o el perfil que queremos utilizar, añadiremos la anotacion @Profile y en el constructor especificaremos el perfil para ese archivo.
Ejemplo:
- @Profile(“dev”)
- @Profile(“qa”)
- @Profile(“default”)
En caso de que no se especifique perfil para iniciar, Spring Boot iniciara con perfil default.
En este ejemplo utilizaremos Produccion como default. Mira el siguiente codigo, asegurate que cada archivo java este apuntando a su respectivo archivo properties y anotacion @Profile.
package com.cristianruizblog.propertiesProject.configuration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.context.annotation.PropertySource;
@Configuration
<strong>@PropertySource({"classpath:dev.properties"})</strong>
<strong>@Profile("dev")</strong>
public class <strong>PropertiesSourceDev</strong> {
}
***********************************************
@Configuration
<strong>@PropertySource({"classpath:qa.properties"})</strong>
<strong>@Profile("qa")</strong>
public class <strong>PropertiesSourceQa</strong>{
}
***********************************************
@Configuration
<strong>@PropertySource({"classpath:prod.properties"})</strong>
<strong>@Profile("default")</strong>
public class <strong>PropertiesSourceProd</strong> {
}
El siguiente paso sera agregar la misma propiedad dentro de los archivos properties.
dev.properties: database.url=http:localhost/devdatabase ******************************************** qa.properties: database.url=http:localhost/qadatabase ******************************************** prod.properties database.url=http:localhost/proddatabase
Y para finalizar hay que especificar en el application.properties con que perfil iniciar la aplicación, y esto se hace con la siguiente propiedad.
#default o Vacio igual a default #puedes escribir dev o qa #Y ver los diferentes comportamientos. spring.profiles.active=
Otra alternativa para especificar el profile es enviar un parámetro de ejecución, utilizando STS:
- Presiona click derecho en el proyecto
- Pon el mouse sobre la opción “Run As”
- Selecciona la ultima opción desplegada “Run Configurations”
- La tercera opción es un campo de texto llamado Profile, ahí puedes escribir el perfil con el que desees iniciar la aplicación, ten en cuenta que este perfil sobrescribira el asignado en el application.properties.
Obviamente hay que mostrar la informacion en algun lado, yo tengo un Controller donde obtengo el valor de properties con la anotacion @Value y lo envio a una vista utilizando un modelo.
Te invito a que actives los diferentes perfiles y estudies el comportamiento de Spring Boot Profiles, también a que asignes el perfil con los dos métodos descritos.
[ALERTA]
Si la clase tiene un perfil definido y no es el perfil activo, Spring Framework Context ignorara por completo esa clase.
[BONUS]
No dudes de visitar mi repositorio github para comparar el codigo o de mirar mi video donde explico un poco mas acerca de Spring Boot Profiles.
convención sobre configuracion
https://github.com/cruizg93/CristianRuizBlog-SpringBootProfileProperties/tree/master
Configuracion de properties con anotacion @Profile
https://github.com/cruizg93/CristianRuizBlog-SpringBootProfileProperties/tree/annotation-config
Gracias por llegar hasta el final de este post