Perfiles en Spring Boot

perfiles-spring-boot

perfiles-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.

Diferentes pérfiles en Spring Boot | Pérfiles en Spring Boot
Diferentes perfiles en Spring Boot

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

Si no específicamos ningún perfil, se escoge el perfil por defecto definido.

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!


Deja una respuesta

Tu dirección de correo electrónico no será publicada.