DEV Community

Isaias Velasquez
Isaias Velasquez

Posted on

How to externalizar properties no Spring Boot sem surpresas

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
Enter fullscreen mode Exit fullscreen mode

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")
    }
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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}
Enter fullscreen mode Exit fullscreen mode

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}")
    }
Enter fullscreen mode Exit fullscreen mode

}

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
Enter fullscreen mode Exit fullscreen mode

Properties de ultimo recurso: @PropertySource para carregar um arquivo especifico:

@Configuration
@PropertySource("classpath:config/custom.properties")
class CustomConfig
Enter fullscreen mode Exit fullscreen mode

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)