Profiles en Spring Boot: configuración por entorno
Índice
- 1. Descripción general
- 2. Marcar componentes con @Profile
- 3. Activar perfiles
- 4. Agregar perfiles sin reemplazar los activos
- 5. Profile Groups
- 6. Expresiones de perfil
- 7. Archivos de configuración por perfil
- 8. Conclusión
1. Descripción general
Los perfiles de Spring permiten segmentar partes de la configuración de una aplicación y hacerlas disponibles únicamente en ciertos entornos. Cualquier @Component, @Configuration o @ConfigurationProperties puede marcarse con @Profile para condicionar su carga.
La anotación pertenece al paquete org.springframework.context.annotation (Spring Framework 7.0.6) y está disponible desde Spring 3.1.
2. Marcar componentes con @Profile
@Profile puede aplicarse de las siguientes formas:
- Como anotación de tipo sobre cualquier clase anotada directa o indirectamente con
@Component, incluyendo clases@Configuration. - Como meta-anotación para componer anotaciones estereotipo personalizadas.
- Como anotación de método sobre métodos
@Bean.
@Configuration(proxyBeanMethods = false)
@Profile("production")
public class ProductionConfiguration {
// beans activos solo en el perfil "production"
}
Cuando una clase @Configuration está marcada con @Profile, todos sus métodos @Bean y sus anotaciones @Import son ignorados a menos que al menos uno de los perfiles especificados esté activo.
Consideración con @ConfigurationProperties
Si los beans @ConfigurationProperties se registran mediante @EnableConfigurationProperties en lugar de escaneo automático, @Profile debe aplicarse sobre la clase @Configuration que contiene @EnableConfigurationProperties, no sobre la clase @ConfigurationProperties en sí. En el caso de escaneo automático, @Profile puede aplicarse directamente sobre la clase @ConfigurationProperties.
Nota sobre métodos @Bean sobrecargados
Con @Profile en métodos @Bean, si existen métodos sobrecargados con el mismo nombre Java, la condición @Profile debe declararse de forma consistente en todos los métodos sobrecargados. Si las condiciones son inconsistentes, solo aplica la condición de la primera declaración. Para definir beans alternativos con distintas condiciones de perfil, se recomienda usar nombres de método Java distintos apuntando al mismo nombre de bean.
3. Activar perfiles
Mediante propiedades
La propiedad spring.profiles.active controla qué perfiles están activos:
# application.properties
spring.profiles.active=dev,hsqldb
# línea de comandos
--spring.profiles.active=dev,hsqldb
La propiedad sigue las mismas reglas de precedencia que el resto de propiedades en Spring Boot: la fuente con mayor prioridad gana. Esto permite definir perfiles en application.properties y sobreescribirlos desde la línea de comandos.
Perfil por defecto
Si ningún perfil está activo, se habilita el perfil default. Su nombre puede cambiarse con:
spring.profiles.default=none
Restricción importante
spring.profiles.active y spring.profiles.default solo pueden usarse en documentos no específicos de perfil. No pueden incluirse en archivos activados por spring.config.activate.on-profile. El siguiente ejemplo es inválido:
spring.profiles.active=prod
#---
spring.config.activate.on-profile=prod
spring.profiles.active=metrics
Activación programática
SpringApplication app = new SpringApplication(MyApp.class);
app.setAdditionalProfiles("dev", "local");
app.run(args);
También es posible activar perfiles mediante la interfaz ConfigurableEnvironment.
Validación de nombres
Por defecto, los nombres de perfil en Spring Boot pueden contener letras, números y los caracteres -, _, ., +, @, y deben comenzar y terminar con una letra o número. Para permitir nombres más flexibles:
spring.profiles.validate=false
4. Agregar perfiles sin reemplazar los activos
spring.profiles.include agrega perfiles adicionales sobre los ya activos, sin reemplazarlos:
spring.profiles.include[0]=common
spring.profiles.include[1]=local
Los perfiles incluidos se agregan antes que los activados por spring.profiles.active. La propiedad se procesa por cada fuente de propiedades, por lo que no aplican las reglas habituales de fusión de listas para tipos complejos.
Al igual que spring.profiles.active, spring.profiles.include no puede usarse en documentos específicos de perfil.
5. Profile Groups
Cuando los perfiles son demasiado granulares, Spring Boot permite agruparlos bajo un nombre lógico:
spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq
Al activar el perfil production, se activan automáticamente proddb y prodmq:
--spring.profiles.active=production
spring.profiles.group también está restringido a documentos no específicos de perfil.
6. Expresiones de perfil
El valor de @Profile acepta expresiones para lógica más compleja. Los operadores disponibles son:
| Operador | Sintaxis | Comportamiento |
|---|---|---|
| AND lógico | "p1 & p2" |
Activo si ambos perfiles están activos |
| OR lógico | "p1 | p2" |
Activo si al menos uno está activo |
| NOT | "!p1" |
Activo si el perfil no está activo |
@Profile("p1 & p2")
@Configuration
public class BothActiveConfig { }
@Profile({"p1", "!p2"})
@Configuration
public class P1ActiveOrP2InactiveConfig { }
En el segundo ejemplo con array, los elementos se evalúan con OR: el componente se registra si p1 está activo o si p2 no está activo.
Si @Profile se omite, el componente se registra independientemente de qué perfiles estén activos.
7. Archivos de configuración por perfil
Spring Boot carga automáticamente archivos de propiedades específicos por perfil. Para un perfil llamado dev, buscará:
application-dev.properties
application-dev.yaml
Estos archivos se cargan además del application.properties base. Las propiedades definidas en archivos de perfil tienen mayor precedencia que las del archivo base.
También es posible usar spring.config.activate.on-profile dentro de un mismo archivo multi-documento:
spring:
datasource:
url: jdbc:h2:mem:testdb
---
spring:
config:
activate:
on-profile: production
datasource:
url: jdbc:postgresql://prod-host/mydb
8. Conclusión
Los perfiles de Spring proveen un mecanismo declarativo para segmentar la configuración por entorno. @Profile controla la carga de beans y configuraciones. spring.profiles.active e spring.profiles.include gestionan la activación desde distintas fuentes. Los Profile Groups simplifican la activación de conjuntos de perfiles relacionados. Los archivos específicos por perfil permiten separar propiedades sin duplicar la configuración base.
Comentarios (0)
Todavía no hay comentarios.
Dejá un comentario