Perfiles en Spring Boot
En este nuevo artículo vamos a ver las diferentes formas que tenemos de aplicar perfiles en Spring Boot.
Esta funcionalidad de Spring Boot que pertenece al core de Spring, nos va a permitir poder trabajar con diferentes entornos como puede ser dev, prod, it etc… Esta es una funcionalidad muy importante e imprescindible para poder configurar diferentes entornos directamente en nuestra aplicación de Spring Boot.
Asignar y activar perfiles en Spring Boot
Para asignar y activar un perfil en Spring Boot encontramos diferentes maneras de hacerlo, vamos a explorarlas y ver cual es la más fácil de realizar.
Activar perfil en Spring Boot con Maven
Una práctica bastante habitual es el uso de definir un profile en maven, en el que según nuestras necesidades podemos incluso añadir unas u otras dependencias o plugins. Cuando añadimos perfiles en Maven se activan especificando la propiedad spring.profiles.active.
<profiles> <profile> <id>dev</id> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <spring.profiles.active>dev</spring.profiles.active> </properties> </profile> <profile> <id>uat</id> <properties> <spring.profiles.active>uat</spring.profiles.active> </properties> </profile> </profiles>
Para permitir la activación del perfil de maven y que pueda ser activado desde Spring, debemos permitir a Maven poder manipular los ficheros de recurso durante el proceso de build. Por lo que vamos vamos a activar la opción de filtering de maven a través del Resource Plugin en el pom.xml, únicamente sino usas spring-boot-starter-parent.
<build> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> … </build>
Vamos a usar la propiedad spring.profiles.active en nuestro application.properties, con el valor que hemos definido en Maven, esta propiedad activará el perfilado.
Y ahora podemos añadir la propiedad a nuestro application.properties:
spring.profiles.active=@springProfile@
Si quieres ejecutarlo desde maven puedes ejecutar el siguiente comando:
mvn clean package -Puat
Activar perfil a través de variables de entorno
Podemos activar nuestro perfil de Spring Boot haciendo uso de variables de entorno, esto nos vendrá bien para entornos cloud o con docker:
export spring_profiles_active=dev
Activar perfil a través de parámetros de la JVM
Se pueden pasar parámetro a la JVM para activar el perfil de Spring Boot de la siguiente manera:
-Dspring.profiles.active=dev
Activar perfil en Spring Boot a través de ConfigurableEnvironment
Podemos activar el perfil de manera programática directamente en nuestro código de la siguiente manera:
@Autowired private ConfigurableEnvironment configurableEnvironment; ... configurableEnvironment.setActiveProfiles("uat");
Activar perfil con el uso de @ActiveProfile
Cuando hacemos nuestra parte de testing en Spring Boot podemos indicar que perfil queremos activar a través de la anotación @ActiveProfiles.
@ActiveProfiles("test")
Activar perfil con ficheros de propiedades en Spring Boot
Una de las formas más fáciles o simples de poder configurar perfiles en Spring Boot es a través de sus ficheros de propiedades.
Un fichero de propiedades por perfil
Los ficheros de propiedades que definamos en Spring pueden tener la extensión properties o yml, pero deben tener la siguiente estructura: application-{profile}.properties.
Si no escribimos ningún perfil se cargarán las propiedades del fichero application.yaml, en cambio al añadir un profile y arrancar la aplicación haciendo referencia a ese profile se cargarán las propiedades de ese perfil. Spring Boot cargará automáticamente en el arranque de la aplicación las propiedades.
Por ejemplo podemos querer diferentes entornos en función de si estamos en desarrollo o un producción, por lo que podríamos crear dos ficheros de la siguiente manera:
- application-dev.properties
spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 spring.datasource.username=sa spring.datasource.password=sa
- application-prod.properties
spring.datasource.url: jdbc:postgresql://localhost:5503/test spring.datasource.driver-class-name: org.postgresql.Driver spring.datasource.username: fdsaf890809809# spring.datasource.password: fdsaf890809809#
De esta manera podemos tener diferentes perfiles en función de nuestras necesidades y activar uno un otro de la siguiente manera:
mvn spring-boot:run -Dspring-boot.run.profiles=dev
o como hemos comentado antes a través de variables:
--spring.profiles.active=dev
Un fichero de propiedades con todos los perfiles en Spring Boot
Aunque podemos crear un fichero por perfil, también podemos crear un único fichero en el que establecemos separaciones por perfil, vamos a verlo:
my.prop=used-always-in-all-profiles #--- spring.config.activate.on-profile=dev spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1 spring.datasource.username=sa spring.datasource.password=sa #--- spring.config.activate.on-profile=prod spring.datasource.url: jdbc:postgresql://localhost:5503/test spring.datasource.driver-class-name: org.postgresql.Driver spring.datasource.username: fdsaf890809809# spring.datasource.password: fdsaf890809809#
En el fichero de propiedades anterior lo que hemos hecho ha sido añadir propiedades en función del perfil por entorno (dev y prod), al igual que hicimos con diferentes ficheros.
Para diferenciar los diferentes entornos tenemos que hacer uso de #— y utilizar la propiedad spring.config.active.on-profile, para indicar que perfil estas activando.
Perfiles de Grupo en Spring Boot
Esta funcionalidad de Spring nos va a permitir agrupar similares perfiles juntos. Es decir, si tenemos dos perfiles con dos configuraciones diferentes pero necesitamos que esos dos perfiles funcionen en un entorno específico podemos hacer uso de la propiedad spring.profiles.group.{group}. Group es el nombre del grupo del perfil elegido.
Para poder activar estos perfiles todos a la vez, lo podemos realizar a través de nuestro fichero application.properties o application.yml escribiendo lo siguiente:
spring.profiles.group.prod=db,uat
Activar beans haciendo uso de @Profile
Una vez que tenemos un perfil activo en Spring, podemos controlar la carga o la activación de determinados Beans en función de ese perfil. Esa funcionalidad se lleva a cabo con @Profile.
Por ejemplo cuando queremos usar diferentes bases de datos, podemos hacer uso de @Profile para cargar un datasource u otro en función del perfil que en ese momento se encuentre activo.
@Component @Profile("dev") public class DevDatasourceConfig implements DatasourceConfig { @Override public void setup() { System.out.println("Setting up datasource for DEV environment. "); } }
@Component @Profile("production") public class ProductionDatasourceConfig implements DatasourceConfig { @Override public void setup() { System.out.println("Setting up datasource for PRODUCTION environment. "); } }
Y cuando hagamos uso del Bean DatasourceConfig, cargaremos el bean del perfil que en ese momento se encuentre activo.
Obtener perfil seleccionado en Spring Boot
Obviamente si establecemos o específicamos un perfil queremos saber cuál es. Para ello Spring Boot nos ofrece diferentes maneras para saber con qué perfil estamos trabajando.
Una de las formas que nos da Spring Boot para saber con qué perfil estamos trabajando es hacer uso de spring.active.profile. Para poder obtener el perfil será suficiente con hacer @Value(«${spring.profiles.active:}»), de esta manera recuperamo el perfil o los perfiles separados por una coma (,).
@Value("${spring.profiles.active}") private String profile;
Y la otra forma que nos ofrece Spring Boot para poder recuperar el perfil que se encuentra activado es inyectando la dependencia de Environment.
@Autowired private Environment environment;
Conclusión
El uso de perfiles en Spring Boot es imprescindible y necesario cuando nuestros proyectos van a hacer uso de diferentes entornos. Es por eso que esta funcionalidad es de vital importancia en cualquier desarrollo que iniciemos.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!