Configuração de aplicações Java: visão geral das melhores bibliotecas e ferramentas
O gerenciamento de configuração é uma das tarefas-chave no desenvolvimento de aplicações enterprise em Java. A forma como você organiza o armazenamento e a leitura de parâmetros (bases de dados, chaves de API, portas, flags de funcionalidades) impacta a flexibilidade, segurança e capacidade de manutenção do seu código. Neste artigo, vamos analisar três das abordagens e bibliotecas mais populares para configuração de aplicações Java com exemplos práticos.
1. Mecanismo integrado: java.util.Properties
A maneira mais simples é usar a classe padrão Properties. Ela lê arquivos no formato .properties (chave=valor). Adequada para projetos pequenos sem hierarquia complexa.
import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;
public class ConfigExample { public static void main(String[] args) { Properties props = new Properties(); try (FileInputStream fis = new FileInputStream("app.properties")) { props.load(fis); String dbUrl = props.getProperty("db.url"); String dbUser = props.getProperty("db.user", "default_user"); System.out.println("URL: " + dbUrl + ", User: " + dbUser); } catch (IOException e) { e.printStackTrace(); } }}Vantagens: não requer dependências adicionais, sintaxe simples.
Desvantagens: sem suporte a aninhamento, tipos, perfis (dev/prod).
2. Typesafe Config (Lightbend Config)
A biblioteca com.typesafe:config (frequentemente usada em projetos com Akka, Play Framework) suporta os formatos HOCON, JSON, .properties. Diferencia-se pela tipagem estrita e pela capacidade de mesclar configurações de diferentes fontes.
Exemplo de arquivo application.conf (HOCON):
database { host = "localhost" port = 5432 credentials { user = "admin" password = ${?DB_PASSWORD} // obtido da variável de ambiente }}logging { level = "INFO"}Leitura em Java:
import com.typesafe.config.Config;import com.typesafe.config.ConfigFactory;
public class TypesafeConfigExample { public static void main(String[] args) { Config config = ConfigFactory.load(); // lê application.conf String host = config.getString("database.host"); int port = config.getInt("database.port"); String user = config.getString("database.credentials.user"); String password = config.getString("database.credentials.password"); System.out.printf("Connecting to %s:%d as %s%n", host, port, user); }}Principais funcionalidades:
- Suporte a
${?VAR}para substituição de variáveis de ambiente. - Mesclagem de configurações: é possível definir um arquivo base e sobrescrever parâmetros para um ambiente específico.
- Verificação estrita de tipos no momento da leitura.
- Carregamento automático a partir do classpath.
3. Spring Framework — @ConfigurationProperties
Se você usa Spring Boot, a configuração se torna extremamente conveniente. Você pode vincular parâmetros de application.properties ou application.yml a beans Java através de anotações.
Exemplo de application.yml:
app: name: "MyApp" datasource: url: jdbc:mysql://localhost:3306/mydb username: root password: secret features: enable-cache: true max-connections: 10Bean Java para mapeamento:
import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;
@Component@ConfigurationProperties(prefix = "app")public class AppConfig { private String name; private Datasource datasource; private Featu