Properties externalizadas sao uma das maiores vantagens do Spring Boot. Elas permitem mudar o comportamento da aplicacao sem recompilar nada.
O jeito mais comum e usar o application.properties:
# application.properties
app.nome=MeuServico
app.versao=1.0.0
server.port=8080
Para acessar no codigo:
@Service
class ConfigService {
@Value("\${app.nome}")
lateinit var nomeApp: String
@Value("\${app.versao}")
lateinit var versao: String
fun mostrar() {
println("$nomeApp - v$versao")
}
}
Um problema comum: se a chave nao existe, o Spring lanca uma excecao na inicializacao. Para evitar isso, use valores default:
@Value("\${app.autor:desconhecido}")
lateinit var autor: String
Para ambientes diferentes, crie arquivos separados:
# application-dev.properties
server.port=8081
spring.datasource.url=jdbc:h2:mem:devdb
# application-prod.properties
server.port=80
spring.datasource.url=jdbc:postgresql://prod:5432/db
Ative o perfil com SPRING_PROFILES_ACTIVE ou --spring.profiles.active:
SPRING_PROFILES_ACTIVE=prod java -jar app.jar
java -jar app.jar --spring.profiles.active=dev
Properties tambem podem vir de variaveis de ambiente. O Spring Boot mapeia automaticamente:
# Variavel de ambiente
export APP_NOME=MeuApp
# No application.properties
app.nome=\${APP_NOME:default}
A configuracao externalizada segue uma ordem de precedencia. Variaveis de ambiente sobrescrevem application.properties, que sobrescrevem valores default.
Para grupos de properties, use @ConfigurationProperties:
# application.properties
app.mail.host=smtp.gmail.com
app.mail.port=587
app.mail.username=user@gmail.com
@ConfigurationProperties(prefix = "app.mail")
@Component
class MailProperties {
var host: String = ""
var port: Int = 587
var username: String = ""
}
@Service
class MailService(private val props: MailProperties) {
fun configurar() {
println("SMTP: ${props.host}:${props.port}")
}
}
O @ConfigurationProperties agrupa todas as properties com prefixo app.mail em um objeto tipado. Muito mais limpo que varios @Value.
Para usar arquivos YAML:
# application.yml
app:
nome: MeuServico
database:
url: jdbc:postgresql://localhost:5432/db
pool:
max: 10
min: 2
Properties de ultimo recurso: @PropertySource para carregar um arquivo especifico:
@Configuration
@PropertySource("classpath:config/custom.properties")
class CustomConfig
Nunca coloque senhas e chaves de API no application.properties. Use variaveis de ambiente ou um servico de secrets.
That's all for now.
Thanks for reading!
Top comments (0)