Using @Value for Property Injection in Spring Boot
📖 Scenario: You are building a simple Spring Boot application that needs to read configuration values from the application.properties file. These values will be injected into your Java class using the @Value annotation.
🎯 Goal: Learn how to use the @Value annotation to inject property values from application.properties into a Spring Boot component.
📋 What You'll Learn
Create an application.properties file with specific properties
Create a Spring Boot component class
Use @Value annotation to inject property values
Add a method to return the injected values
💡 Why This Matters
🌍 Real World
Injecting configuration values like app name, version, or API keys into Spring Boot components is common in real applications.
💼 Career
Understanding @Value is essential for configuring Spring Boot apps and managing environment-specific settings.
Progress0 / 4 steps
1
Create application.properties with properties
Create an application.properties file with these exact entries: app.name=MySpringApp app.version=1.0.3
Spring Boot
Hint
Properties files use key=value format. Make sure to write exactly app.name=MySpringApp and app.version=1.0.3.
2
Create a Spring Boot component class
Create a Java class named AppInfo annotated with @Component inside package com.example.demo.
Spring Boot
Hint
Use @Component annotation above the class declaration to make it a Spring bean.
3
Inject properties using @Value
Inside the AppInfo class, create two private String fields named name and version. Use @Value to inject ${app.name} into name and ${app.version} into version.
Spring Boot
Hint
Use @Value("${property.key}") above each field to inject the property value.
4
Add method to return injected values
Add a public method getAppDetails() in AppInfo that returns a String combining name and version in this format: "App: MySpringApp, Version: 1.0.3".
Spring Boot
Hint
Concatenate the fields name and version with the text exactly as shown.
Practice
(1/5)
1. What is the main purpose of the @Value annotation in Spring Boot?
easy
A. To create database connections
B. To define a new Spring bean
C. To handle HTTP requests
D. To inject values from configuration files into Spring beans
Solution
Step 1: Understand the role of @Value
@Value is used to inject configuration values like those from application.properties into Spring beans.
Step 2: Compare with other options
Defining beans, handling HTTP requests, and database connections are done by other annotations or classes, not @Value.
Final Answer:
To inject values from configuration files into Spring beans -> Option D
Quick Check:
@Value injects config values = A [OK]
Hint: Remember: @Value pulls config values into your code [OK]
Common Mistakes:
Confusing @Value with @Bean or @Autowired
Thinking @Value handles HTTP or DB tasks
Ignoring that @Value reads from properties
2. Which of the following is the correct syntax to inject a property named app.name using @Value?
easy
A. @Value(${app.name}) private String appName;
B. @Value("${app.name}") private String appName;
C. @Value("app.name") private String appName;
D. @Value(app.name) private String appName;
Solution
Step 1: Recall correct syntax for property injection
The property key must be inside ${} and the whole expression inside quotes: @Value("${property.key}").
Step 2: Check each option
@Value("${app.name}") private String appName; matches the correct syntax. The other options miss either the quotes around the expression, the ${} delimiters, or use quotes around just the property name.
Final Answer:
@Value("${app.name}") private String appName; -> Option B
Quick Check:
Correct syntax uses ${} inside quotes = D [OK]
Hint: Use @Value("${property.key}") with quotes and ${} [OK]
Common Mistakes:
Omitting quotes around the expression
Forgetting the ${} around the property key
Using plain property name without ${}
3. Given the property server.port=8080 in application.properties, what will be the output of this Spring component?
public class ServerConfig {
@Value("${server.port}")
private int port;
public int getPort() {
return port;
}
}
// In main method:
ServerConfig config = new ServerConfig();
System.out.println(config.getPort());
medium
A. 0
B. 8080
C. null
D. Compilation error
Solution
Step 1: Understand Spring bean lifecycle and injection
Property injection with @Value happens only when Spring creates and manages the bean. Here, ServerConfig is created manually with new, so injection does not happen.
Step 2: Check default value of int field
Since port is a primitive int and not injected, it defaults to 0.
Final Answer:
0 -> Option A
Quick Check:
Manual new means no injection, int defaults to 0 [OK]
Hint: Only Spring-managed beans get @Value injection [OK]
When missing.property is not defined in properties, the application fails to start with an error.
medium
A. The field must be public for @Value to work
B. The property key must be defined; default values are not supported
C. The default value syntax is incorrect; colon should be inside quotes
D. The @Value annotation cannot be used on String fields
Solution
Step 1: Check default value syntax in @Value
The default value must be inside the quotes as part of the expression: @Value("${property:default}") is correct.
Step 2: Identify the error cause
If the colon is outside quotes or expression is malformed, Spring cannot parse it and throws an error.
Final Answer:
The default value syntax is incorrect; colon should be inside quotes -> Option C
Quick Check:
Default values must be inside ${} quotes [OK]
Hint: Put default after colon inside quotes in @Value [OK]
Common Mistakes:
Placing colon outside the quotes
Assuming default values are not supported
Making fields public unnecessarily
5. You want to inject a list of strings from a property app.modes=dev,prod,test into a Spring bean using @Value. Which approach correctly converts the property into a List<String>?
hard
A. @Value("#{T(java.util.Arrays).asList('${app.modes}'.split(','))}") private List<String> modes;
B. @Value("${app.modes}") private List<String> modes; // Spring auto-converts comma-separated string
C. @Value("${app.modes}") private String[] modes; // Use array instead of List
D. @Value("${app.modes}") private String modes; // Parse manually later
Solution
Step 1: Understand property injection for collections
Spring does not automatically convert comma-separated strings to List<String> with plain @Value.
Step 2: Use SpEL expression for conversion
@Value("#{T(java.util.Arrays).asList('${app.modes}'.split(','))}") private List<String> modes; uses Spring Expression Language (SpEL) to split the string and convert it to a List<String>, which is the correct approach.
Final Answer:
@Value("#{T(java.util.Arrays).asList('${app.modes}'.split(','))}") private List<String> modes; -> Option A
Quick Check:
Use SpEL split and asList for List injection [OK]
Hint: Use SpEL with split and asList to inject List<String> [OK]
Common Mistakes:
Expecting automatic conversion from String to List
Using array when List is required without conversion
Injecting as String and forgetting to parse
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.