Cloud Native, Container First Java framework for building efficient Java applications with fast startup times and low memory usage
—
Quarkus provides a comprehensive configuration system based on MicroProfile Config with build-time resolution, type-safe configuration mapping, and support for multiple configuration sources including environment variables, system properties, and configuration files.
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigProperty {
String name() default "";
String defaultValue() default ConfigProperty.UNCONFIGURED_VALUE;
String UNCONFIGURED_VALUE = "<<unset>>";
}Injects configuration properties into fields or method parameters with optional default values.
Usage Example:
@ApplicationScoped
public class DatabaseService {
@ConfigProperty(name = "database.host", defaultValue = "localhost")
String host;
@ConfigProperty(name = "database.port", defaultValue = "5432")
int port;
@ConfigProperty(name = "database.username")
String username;
@ConfigProperty(name = "database.password")
Optional<String> password; // Optional for properties that may not be set
public void connect() {
System.out.println("Connecting to " + host + ":" + port);
}
}# application.properties
database.host=localhost
database.port=5432
# application-dev.properties
%dev.database.host=dev-server
%dev.database.port=5433
# application-prod.properties
%prod.database.host=prod-server
%prod.database.port=5434Configuration values can be overridden per profile using the %{profile}. prefix.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigMapping {
String prefix() default "";
NamingStrategy namingStrategy() default NamingStrategy.KEBAB_CASE;
}
public enum NamingStrategy {
KEBAB_CASE,
SNAKE_CASE,
VERBATIM
}Maps configuration properties to type-safe configuration classes.
Usage Example:
@ConfigMapping(prefix = "database")
public interface DatabaseConfig {
String host();
int port();
Optional<String> username();
Optional<String> password();
ConnectionPool connectionPool();
interface ConnectionPool {
@WithDefault("10")
int maxConnections();
@WithDefault("PT30S")
Duration timeout();
}
}
// Usage in a service
@ApplicationScoped
public class DatabaseService {
@Inject
DatabaseConfig config;
public void connect() {
System.out.println("Connecting to " + config.host() + ":" + config.port());
System.out.println("Max connections: " + config.connectionPool().maxConnections());
}
}@Target({ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface WithDefault {
String value();
}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface WithName {
String value();
}
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface WithParentName {
}Annotations for customizing configuration mapping behavior.
Usage Example:
@ConfigMapping(prefix = "server")
public interface ServerConfig {
@WithName("listen-port")
@WithDefault("8080")
int port();
@WithDefault("localhost")
String host();
Ssl ssl();
@WithParentName
interface Ssl {
@WithDefault("false")
boolean enabled();
Optional<String> keystore();
Optional<String> keystorePassword();
}
}public class ConfigProvider {
public static Config getConfig();
public static Config getConfig(ClassLoader loader);
}Provides programmatic access to the configuration.
public interface Config {
<T> T getValue(String propertyName, Class<T> propertyType);
<T> Optional<T> getOptionalValue(String propertyName, Class<T> propertyType);
Iterable<String> getPropertyNames();
Iterable<ConfigSource> getConfigSources();
}Main configuration access interface.
Usage Example:
@ApplicationScoped
public class ConfigService {
public void printConfig() {
Config config = ConfigProvider.getConfig();
// Get required value
String appName = config.getValue("app.name", String.class);
// Get optional value
Optional<String> version = config.getOptionalValue("app.version", String.class);
// Get value with default
int timeout = config.getOptionalValue("app.timeout", Integer.class).orElse(30);
System.out.println("App: " + appName + ", Version: " + version.orElse("unknown"));
}
}public interface ConfigSource {
Map<String, String> getProperties();
String getValue(String propertyName);
String getName();
default int getOrdinal() { return 100; }
}Interface for implementing custom configuration sources.
Usage Example:
public class DatabaseConfigSource implements ConfigSource {
@Override
public Map<String, String> getProperties() {
// Load from database
return loadFromDatabase();
}
@Override
public String getValue(String propertyName) {
return getProperties().get(propertyName);
}
@Override
public String getName() {
return "DatabaseConfigSource";
}
@Override
public int getOrdinal() {
return 200; // Higher priority than default files
}
}public interface ConfigSourceProvider {
Iterable<ConfigSource> getConfigSources(ClassLoader forClassLoader);
}Interface for providing multiple configuration sources.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigRoot {
ConfigPhase phase() default ConfigPhase.RUN_TIME;
String name() default "";
}
public enum ConfigPhase {
BUILD_TIME,
BUILD_TIME_AND_RUN_TIME,
RUN_TIME
}Marks configuration root classes for build-time processing.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigGroup {
}Groups related configuration properties together.
Usage Example:
@ConfigRoot(phase = ConfigPhase.RUN_TIME)
public class AppConfig {
@ConfigItem
public String name;
@ConfigItem(defaultValue = "INFO")
public String logLevel;
@ConfigItem
public DatabaseConfig database;
}
@ConfigGroup
public class DatabaseConfig {
@ConfigItem(defaultValue = "localhost")
public String host;
@ConfigItem(defaultValue = "5432")
public int port;
}Configuration profiles can be activated using:
-Dquarkus.profile=devQUARKUS_PROFILE=devquarkus.profile=devSystem.setProperty("quarkus.profile", "dev")# Default configuration
app.timeout=30
database.pool.size=10
# Development profile
%dev.app.timeout=5
%dev.database.pool.size=5
# Production profile
%prod.app.timeout=60
%prod.database.pool.size=50
# Test profile
%test.app.timeout=1
%test.database.pool.size=1public class ProfileManager {
public static String getActiveProfile();
public static List<String> getActiveProfiles();
public static boolean isActiveProfile(String profile);
}Utility class for profile management.
Usage Example:
@ApplicationScoped
public class EnvironmentService {
public void logEnvironment() {
String profile = ProfileManager.getActiveProfile();
System.out.println("Running in profile: " + profile);
if (ProfileManager.isActiveProfile("dev")) {
System.out.println("Development mode enabled");
}
}
}Quarkus provides converters for common types:
public interface Converter<T> {
T convert(String value) throws IllegalArgumentException, NullPointerException;
}Interface for implementing custom type converters.
Usage Example:
public class UriConverter implements Converter<URI> {
@Override
public URI convert(String value) {
try {
return new URI(value);
} catch (URISyntaxException e) {
throw new IllegalArgumentException("Invalid URI: " + value, e);
}
}
}
// Register in META-INF/services/org.eclipse.microprofile.config.spi.Converter@ConfigProperty(name = "database.password")
@Secret
String encryptedPassword;Configuration values can be encrypted and automatically decrypted at runtime.
public interface CredentialsProvider {
Map<String, String> getCredentials(String credentialsProviderName);
}Interface for implementing custom credential providers (e.g., HashiCorp Vault, AWS Secrets Manager).
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigDocSection {
String name() default "";
boolean generated() default false;
}Annotation for documenting configuration sections in generated documentation.
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ConfigDocMapKey {
String value();
}Documents map-based configuration properties.
Usage Example:
@ConfigRoot
@ConfigDocSection(name = "Application Configuration")
public class AppConfig {
/**
* The name of the application
*/
@ConfigItem
public String name;
/**
* HTTP server configuration
*/
@ConfigItem
@ConfigDocSection(name = "HTTP Server")
public HttpConfig http;
/**
* Feature flags
*/
@ConfigItem
@ConfigDocMapKey("feature-name")
public Map<String, Boolean> features;
}Install with Tessl CLI
npx tessl i tessl/maven-io-quarkus--quarkus-bom