08 - Spring Profiles
O que é Profiling?
Spring Profiles é um recurso que permite definir diferentes configurações para diferentes ambientes (ou casos de uso) sem alterar o código da sua aplicação.
Em vez de modificar arquivos de configuração toda vez que você implanta sua aplicação, você pode criar configurações específicas do ambiente e ativar o profile apropriado.
Ambientes comuns incluem:
- Desenvolvimento (
dev) - Teste (
test) - Homologação (
staging) - Produção (
prod) - Local (
local)
Cada profile pode ter seus próprios:
- Definições de Bean
- Propriedades
- Configuração de banco de dados
- Serviços externos
- Configurações de segurança
- Configuração de log
Isso ajuda a manter a aplicação limpa, manutenível e independente do ambiente.
Por que usar Spring Profiles?
Sem profiles, desenvolvedores frequentemente precisam:
- Comentar/descomentar código de configuração
- Alterar URLs de banco de dados manualmente
- Modificar endpoints de API antes da implantação
- Correr o risco de implantar configurações de desenvolvimento em produção
Spring Profiles resolvem esses problemas carregando automaticamente a configuração correta com base no ambiente ativo.
Por exemplo:
| Ambiente | Banco de Dados | Log |
|---|---|---|
| dev | PostgreSQL Local | DEBUG |
| test | Banco de Dados de Teste | INFO |
| prod | Banco de Dados de Produção | WARN |
Como usar?
1. Crie arquivos de configuração específicos do ambiente
application.properties
application-dev.properties
application-test.properties
application-prod.properties
Exemplo:
application-dev.properties
server.port=8080
spring.datasource.url=jdbc:postgresql://localhost/devdb
logging.level.root=DEBUG
application-prod.properties
server.port=8080
spring.datasource.url=jdbc:postgresql://prod-server/proddb
logging.level.root=WARN
2. Ative um profile
Usando application.properties
spring.profiles.active=dev
Usando variáveis de ambiente
SPRING_PROFILES_ACTIVE=prod
Usando linha de comando
java -jar app.jar --spring.profiles.active=prod
ou
mvn spring-boot:run -Dspring-boot.run.profiles=dev
3. Spring carrega a configuração correspondente
Se o profile ativo for:
dev
Spring carrega:
application.properties
+
application-dev.properties
Propriedades no arquivo específico do profile sobrescrevem as padrão.
Anotação @Profile
A anotação @Profile permite que um Spring Bean seja criado apenas quando um profile específico está ativo.
Exemplo
@Service
@Profile("dev")
public class MockEmailService implements EmailService {
@Override
public void send() {
System.out.println("Sending fake email...");
}
}
Este bean existe apenas quando o profile dev está ativo.
Outra implementação:
@Service
@Profile("prod")
public class SmtpEmailService implements EmailService {
@Override
public void send() {
System.out.println("Sending real email...");
}
}
Ao executar com:
spring.profiles.active=prod
Spring cria:
SmtpEmailService
Ao executar com:
spring.profiles.active=dev
Spring cria:
MockEmailService
Nenhuma alteração de código é necessária.
Múltiplos Profiles
Um bean pode pertencer a múltiplos profiles.
@Service
@Profile({"dev", "test"})
public class MockNotificationService {
}
O bean será criado se dev ou test estiver ativo.
Negando um Profile
Você pode ativar um bean quando um profile não está ativo.
@Service
@Profile("!prod")
public class ConsoleLogger {
}
Este bean é criado para todos os profiles, exceto prod.
Expressões de Profile
Spring também suporta expressões de profile.
@Profile("dev & cloud")
O bean é criado somente se ambos os profiles estiverem ativos.
@Profile("dev | test")
O bean é criado se qualquer um dos profiles estiver ativo.
@Profile("prod & !cloud")
O bean é criado somente quando executando em prod mas não no profile cloud.
Casos de Uso Típicos
Spring Profiles são comumente usados para:
- Alternar entre bancos de dados de desenvolvimento e produção
- Usar implementações mock durante o desenvolvimento
- Habilitar beans apenas para teste
- Configurar diferentes configurações de segurança
- Conectar a diferentes serviços de terceiros
- Habilitar ou desabilitar tarefas agendadas
- Alterar níveis de log
- Configuração de features específicas do ambiente
Vantagens
- Separação limpa das configurações de ambiente
- Sem modificações de código entre as implantações
- Fácil gerenciamento de ambiente
- Simplifica os testes
- Suporta diferentes configurações de infraestrutura
- Funciona perfeitamente com Spring Boot
- Fácil integração com Docker, Kubernetes e pipelines de CI/CD
Desvantagens
- Perfis demais podem se tornar difíceis de gerenciar
- Profile ativo incorreto pode causar comportamento inesperado
- Não se destina a feature toggles (use feature flags ou
@ConditionalOnPropertyem vez disso) - Configurações específicas de profile podem se tornar duplicadas se não forem organizadas cuidadosamente
Melhores Práticas
- Mantenha um
application.propertiespadrão para configurações comuns. - Use profiles apenas para comportamento específico do ambiente.
- Prefira nomes de profile significativos (
dev,test,staging,prod). - Evite incorporar lógica de negócios em beans específicos de profile.
- Para habilitar/desabilitar features individuais, prefira
@ConditionalOnPropertyem vez de criar muitos profiles.
Resumo
Spring Profiles oferece uma maneira limpa de separar as configurações da aplicação para diferentes ambientes. Ao ativar um profile específico, Spring carrega as propriedades apropriadas e cria apenas os beans associados a esse profile através da anotação @Profile. Isso torna as aplicações mais fáceis de configurar, implantar e manter em ambientes de desenvolvimento, teste, homologação e produção.