Using @ConfigurationProperties for Type-Safe Configuration in Spring Boot
📖 Scenario: You are building a Spring Boot application that needs to read configuration values from application.properties in a clean and type-safe way.This helps avoid mistakes like typos in property names and makes your code easier to maintain.
🎯 Goal: Create a Spring Boot configuration class using @ConfigurationProperties to map properties from application.properties into a Java class with fields.Use this class to access configuration values in a type-safe manner.
📋 What You'll Learn
Create a Java class named AppConfig with fields appName (String) and maxUsers (int).
Annotate AppConfig with @ConfigurationProperties using prefix app.
Enable configuration properties scanning in the main Spring Boot application class.
Create application.properties with app.appName=MyApp and app.maxUsers=100.
Inject AppConfig into a Spring component and use its fields.
💡 Why This Matters
🌍 Real World
Type-safe configuration helps avoid errors from mistyped property names and makes configuration easier to manage in real Spring Boot applications.
💼 Career
Many Java backend jobs require working with Spring Boot and managing application configuration cleanly and safely using @ConfigurationProperties.
Progress0 / 4 steps
1
Create the configuration properties class
Create a Java class named AppConfig with private fields appName (String) and maxUsers (int). Add public getters and setters for both fields.
Spring Boot
Hint
Define private fields and generate public getters and setters for each.
2
Annotate the class with @ConfigurationProperties
Add the annotation @ConfigurationProperties(prefix = "app") above the AppConfig class declaration. Also add @Component annotation to make it a Spring bean.
Spring Boot
Hint
Use @Component and @ConfigurationProperties(prefix = "app") annotations on the class.
3
Enable configuration properties scanning
In your main Spring Boot application class, add the annotation @EnableConfigurationProperties above the class declaration to enable scanning of @ConfigurationProperties beans.
Spring Boot
Hint
Add @EnableConfigurationProperties annotation on the main application class.
4
Use AppConfig in a Spring component
Create a Spring component class named AppInfoPrinter. Inject AppConfig via constructor and add a method printInfo() that returns a String combining appName and maxUsers from AppConfig.
Spring Boot
Hint
Inject AppConfig via constructor and use its getters in printInfo().
Practice
(1/5)
1. What is the main purpose of using @ConfigurationProperties in a Spring Boot application?
easy
A. To create REST endpoints automatically
B. To bind external configuration properties to a Java class for type-safe access
C. To define database entities
D. To handle HTTP requests and responses
Solution
Step 1: Understand the role of @ConfigurationProperties
This annotation is used to map properties from configuration files (like application.properties or application.yml) into Java classes.
Step 2: Identify the benefit of type-safe access
By binding properties to a class, you avoid manual parsing and get compile-time checking of property names and types.
Final Answer:
To bind external configuration properties to a Java class for type-safe access -> Option B
Hint: Remember: @ConfigurationProperties maps config to Java class [OK]
Common Mistakes:
Confusing @ConfigurationProperties with REST controllers
Thinking it creates database entities
Assuming it handles HTTP requests
2. Which of the following is the correct way to enable @ConfigurationProperties support in a Spring Boot application?
easy
A. Add @RestController on the configuration class
B. Annotate the class with @Entity
C. Annotate the class with @Component or use @EnableConfigurationProperties on a configuration class
D. Use @Service annotation on the properties class
Solution
Step 1: Identify how Spring Boot detects @ConfigurationProperties classes
Spring Boot requires the class to be a Spring bean, which can be done by annotating it with @Component or by enabling it via @EnableConfigurationProperties.
Step 2: Recognize incorrect annotations
@Entity is for JPA entities, @RestController is for web controllers, and @Service is for service layer beans, none of which enable configuration properties binding.
Final Answer:
Annotate the class with @Component or use @EnableConfigurationProperties on a configuration class -> Option C
Quick Check:
Enable with @Component or @EnableConfigurationProperties [OK]
Hint: Use @Component or @EnableConfigurationProperties to activate binding [OK]
Common Mistakes:
Using @Entity or @RestController instead of @Component
Forgetting to register the properties class as a bean
Assuming @Service enables configuration binding
3. Given the following configuration class and properties, what will be the value of appProperties.getTimeout()?
application.yml:
app:
timeout: 5000
Java class:
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private int timeout;
public int getTimeout() { return timeout; }
public void setTimeout(int timeout) { this.timeout = timeout; }
}
medium
A. 5000
B. 0
C. null
D. Throws an exception
Solution
Step 1: Match property prefix and field
The prefix 'app' matches the class prefix, and 'timeout' matches the field name, so the value 5000 binds correctly.
Step 2: Understand default value and binding
Since the property is set in the YAML, the field will be set to 5000, not the default 0 or null.
Final Answer:
5000 -> Option A
Quick Check:
Property value binds correctly = 5000 [OK]
Hint: Match prefix and field names exactly for binding [OK]
Common Mistakes:
Assuming default 0 because of missing @Value
Confusing null with primitive int default
Expecting exception without validation
4. Consider this configuration class:
@ConfigurationProperties(prefix = "server")
public class ServerConfig {
private String host;
private int port;
public String getHost() { return host; }
public void setHost(String host) { this.host = host; }
public int getPort() { return port; }
public void setPort(int port) { this.port = port; }
}
If the application.yml contains:
server:
host: localhost
port: notANumber
What will happen when Spring Boot starts?
medium
A. Port is set to 0 by default, application starts normally
B. Application starts, port is set to string 'notANumber'
C. Port is ignored, host is set, application starts with warning
D. Application fails to start with a binding exception due to invalid port value
Solution
Step 1: Analyze property type mismatch
The 'port' field is an int, but the YAML provides a non-numeric string 'notANumber', causing a type mismatch.
Step 2: Understand Spring Boot binding behavior
Spring Boot throws a binding exception on startup if it cannot convert the property to the required type.
Final Answer:
Application fails to start with a binding exception due to invalid port value -> Option D
Quick Check:
Invalid type causes startup failure [OK]
Hint: Type mismatch in config causes startup failure [OK]
Common Mistakes:
Assuming default values are used silently
Expecting warnings instead of errors
Thinking string can be assigned to int field
5. You want to create a nested configuration properties class to map this YAML:
app:
security:
enabled: true
roles:
- USER
- ADMIN
Which of the following Java class structures correctly uses @ConfigurationProperties to map this nested config?
hard
A. public class AppProperties {
private Security security;
public static class Security {
private boolean enabled;
private List<String> roles;
// getters and setters
}
// getters and setters
}
@ConfigurationProperties(prefix = "app")
@Component
public class AppProperties {}
B. @ConfigurationProperties(prefix = "app.security")
@Component
public class Security {
private boolean enabled;
private List<String> roles;
// getters and setters
}
C. @ConfigurationProperties(prefix = "app")
@Component
public class AppProperties {
private boolean enabled;
private List<String> roles;
// getters and setters
}
D. @ConfigurationProperties(prefix = "security")
@Component
public class Security {
private boolean enabled;
private List<String> roles;
// getters and setters
}
Solution
Step 1: Understand nested property mapping
To map nested properties, create a nested class inside the main properties class and define fields matching the nested keys.
Step 2: Match prefix and class structure
The prefix 'app' matches the root, and the nested Security class maps the 'security' subtree with 'enabled' and 'roles'. The main class must be annotated with @ConfigurationProperties and registered as a bean.
Step 3: Evaluate options
public class AppProperties {
private Security security;
public static class Security {
private boolean enabled;
private List<String> roles;
// getters and setters
}
// getters and setters
}
@ConfigurationProperties(prefix = "app")
@Component
public class AppProperties {} correctly nests Security inside AppProperties and uses prefix 'app'. @ConfigurationProperties(prefix = "app.security")
@Component
public class Security {
private boolean enabled;
private List<String> roles;
// getters and setters
} uses prefix 'app.security' but does not nest. @ConfigurationProperties(prefix = "app")
@Component
public class AppProperties {
private boolean enabled;
private List<String> roles;
// getters and setters
} flattens properties incorrectly. @ConfigurationProperties(prefix = "security")
@Component
public class Security {
private boolean enabled;
private List<String> roles;
// getters and setters
} uses wrong prefix.
Final Answer:
Option A with nested Security class inside AppProperties and prefix 'app' -> Option A
Quick Check:
Nested class + prefix 'app' = correct mapping [OK]
Hint: Use nested classes for nested config with root prefix [OK]
Common Mistakes:
Using wrong prefix for nested properties
Flattening nested properties into one class
Not annotating main class with @ConfigurationProperties
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.