Spring Boot @ConfigurationProperties Example
June 15, 2019
Spring Boot @ConfigurationProperties
is annotation for externalized configuration. To inject property value from a property file to a class, we can add @ConfigurationProperties
at a class level with stereotype annotations such as @Component
or add @ConfigurationProperties
to a @Bean
method in a @Configuration
class. @ConfigurationProperties
is used to bind and validate external properties from property files such as .properties
file. @ConfigurationProperties
has following optional elements.
ignoreInvalidFields: Boolean to ignore invalid fields.
ignoreUnknownFields: Boolean to ignore unknown fields.
prefix: The prefix of the properties to bind to this object.
value: The prefix of the properties to bind to this object.
To inject values from property file using
@ConfigurationProperties
, our class must create setter methods of the class properties. Here we will discuss using @ConfigurationProperties
in detail with examples.
Contents
- Technologies Used
- Steps to use @ConfigurationProperties
- Using Prefix with @ConfigurationProperties
- Using @ConfigurationProperties with @Bean
- Using @ConfigurationProperties with Object, List, Map and Array Properties
- Using @ConfigurationProperties with @EnableConfigurationProperties
- Using @Validated with @ConfigurationProperties
- Maven
- YAML File
- Reference
- Download Source Code
Technologies Used
Find the technologies being used in our example.1. Java 11
2. Spring 5.1.7.RELEASE
3. Spring Boot 2.1.5.RELEASE
4. Hibernate Validator 6.0.16
5. Maven 3.5.2
Steps to use @ConfigurationProperties
Find the steps to use@ConfigurationProperties
annotation.
1. Create a class annotated with
@ConfigurationProperties
and @Component
. Here we have string and integer properties in our class.
Team.java
package com.concretepage; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties public class Team { private String team; private int teamSize; private String teamLeader; //Setters and Getters public String toString() { return "Team:" + team + " - " + teamSize + " - " + teamLeader; } }
@ConfigurationProperties
.
2. The property name of more than one word such as
teamSize
can bind the properties name such as teamSize
or team-size
or team_size
in property file. Find the property file.
myteam.properties
team=XYZ Team team-size=3 team-leader=Mahesh
.properties
file using @PropertySource
annotation.
AppConfig.java
package com.concretepage; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource("classpath:myteam.properties") public class AppConfig { }
Team
class and accordingly we can inject this class to any other class as required and fetch value.
4. Now run the application.
MySpringBootApp.java
package com.concretepage; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; @SpringBootApplication public class MySpringBootApp { public static void main(String[] args) { final ApplicationContext ctx = SpringApplication.run(MySpringBootApp.class, args); final Team team = ctx.getBean(Team.class); System.out.println("--- Team ---"); System.out.println(team); } }
--- Team --- Team:XYZ Team - 3 - Mahesh
Using Prefix with @ConfigurationProperties
We can use prefix element in@ConfigurationProperties
annotation. If the properties of property file starts with a prefix, that can be configured in @ConfigurationProperties
. Find the property file.
myteam.properties
app.team=XYZ Team app.team-size=3 app.team-leader=Mahesh
app
word. We need to configure it in @ConfigurationProperties
to inject these values in Team
class.
Team.java
@Component @ConfigurationProperties(prefix="app") public class Team { private String team; private int teamSize; private String teamLeader; //Setters and Getters public String toString() { return "Team:" + team + " - " + teamSize + " - " + teamLeader; } }
Using @ConfigurationProperties with @Bean
We can use@ConfigurationProperties
with @Bean
as well as @Component
annotation. In above example, we have used @ConfigurationProperties
with @Component
. Here we will create an example to use @ConfigurationProperties
with @Bean
.
We need to use
@ConfigurationProperties
with @Bean
at method level. Find the example.
AppConfig.java
package com.concretepage; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource({"classpath:myteam.properties", "classpath:project-util.properties"}) public class AppConfig { @Bean @ConfigurationProperties(prefix="project") public Project getProject() { return new Project(); } }
package com.concretepage; public class Project { private String projectName; private int size; private String manager; //Setters and getters public String toString() { return "Project:" + projectName + " - " + size + " - " + manager; } }
project.project-name=PQR Project project.size=10 project.manager=John
Using @ConfigurationProperties with Object, List, Map and Array Properties
In above examples, we have seen how to bind simple properties with a class. Now we will provide examples to bind Object, List, Map and Array Properties using@ConfigurationProperties
.
myteam.properties
app.team=XYZ Team app.team-size=3 app.team-leader=Mahesh #Object properties app.company.name=ABC Ltd app.company.ceo=Narendra app.company.location=Delhi #List properties app.employees[0].name=Amar app.employees[0].designation=Developer app.employees[0].age=25 app.employees[1].name=Akbar app.employees[1].designation=Tester app.employees[1].age=23 app.employees[2].name=Anthony app.employees[2].designation=Designer app.employees[2].age=27 #Map Properties app.technologies.BACKEND=Java app.technologies.FRONTEND=Angular app.technologies.DATABASE=Oracle #Array Properties app.clients[0]=A Client app.clients[1]=B Client app.clients[2]=C Client
@Configuration @PropertySource({"classpath:myteam.properties", "classpath:project-util.properties"}) public class AppConfig { ------ }
@Component @ConfigurationProperties(prefix="app") public class Team { private String team; private int teamSize; private String teamLeader; private Company company; private List<Employee> employees; private Map<String, String> technologies; private String[] clients; //Setters and Getters public String toString() { return "Team:" + team + " - " + teamSize + " - " + teamLeader; } }
1. Object Properties
myteam.properties
#Object properties app.company.name=ABC Ltd app.company.ceo=Narendra app.company.location=Delhi
@Component @ConfigurationProperties(prefix="app") public class Team { ------ private Company company; public Company getCompany() { return company; } public void setCompany(Company company) { this.company = company; } ------ }
package com.concretepage; public class Company { private String name; private String ceo; private String location; //Setters and Getters public String toString() { return "Company:" + name + " - " + ceo + " - " + location; } }
2. List Properties
myteam.properties
#List properties app.employees[0].name=Amar app.employees[0].designation=Developer app.employees[0].age=25 app.employees[1].name=Akbar app.employees[1].designation=Tester app.employees[1].age=23 app.employees[2].name=Anthony app.employees[2].designation=Designer app.employees[2].age=27
@Component @ConfigurationProperties(prefix="app") public class Team { ------ private List<Employee> employees; public List<Employee> getEmployees() { return employees; } public void setEmployees(List<Employee> employees) { this.employees = employees; } ------ }
package com.concretepage; public class Employee { private String name; private String designation; private int age; //Setters and Getters public String toString() { return "Employee:" + name + " - " + designation + " - " + age; } }
3. Map Properties
myteam.properties
#Map Properties app.technologies.BACKEND=Java app.technologies.FRONTEND=Angular app.technologies.DATABASE=Oracle
@Component @ConfigurationProperties(prefix="app") public class Team { ------ private Map<String, String> technologies; public Map<String, String> getTechnologies() { return technologies; } public void setTechnologies(Map<String, String> technologies) { this.technologies = technologies; } ------ }
4. Array Properties
myteam.properties
#Array Properties app.clients[0]=A Client app.clients[1]=B Client app.clients[2]=C Client
@Component @ConfigurationProperties(prefix="app") public class Team { ------ private String[] clients; public String[] getClients() { return clients; } public void setClients(String[] clients) { this.clients = clients; } ------ }
Now let us run the demo application.
MySpringBootApp.java
package com.concretepage; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; @SpringBootApplication public class MySpringBootApp { public static void main(String[] args) { final ApplicationContext ctx = SpringApplication.run(MySpringBootApp.class, args); final Team team = ctx.getBean(Team.class); System.out.println("--- Team ---"); System.out.println(team); System.out.println("--- Team Employee---"); team.getEmployees().forEach(e -> System.out.println(e)); System.out.println("--- Technologies ---"); System.out.println(team.getTechnologies().size()); team.getTechnologies().forEach(((t, v) -> System.out.println(t + " - " + v))); System.out.println("--- Company ---"); System.out.println(team.getCompany()); System.out.println("--- Clients ---"); for (String c : team.getClients()) { System.out.println(c); } System.out.println("--- Project ---"); final Project project = ctx.getBean(Project.class); System.out.println(project); } }
--- Team --- Team:XYZ Team - 3 - Mahesh --- Team Employee--- Employee:Amar - Developer - 25 Employee:Akbar - Tester - 23 Employee:Anthony - Designer - 27 --- Technologies --- 3 FRONTEND - Angular DATABASE - Oracle BACKEND - Java --- Company --- Company:ABC Ltd - Narendra - Delhi --- Clients --- A Client B Client C Client --- Project --- Project:PQR Project - 10 - John
Using @ConfigurationProperties with @EnableConfigurationProperties
Suppose we have a class annotated with@ConfigurationProperties
but it is not annotated with @Component
or it is not a Spring bean. In this case to inject value from property file using @ConfigurationProperties
, we use @EnableConfigurationProperties
annotation in conjunction with @SpringBootApplication
and specify the @ConfigurationProperties
annotated class to @EnableConfigurationProperties
.
Find the example. Here we remove
@Component
from Team.java
.
Team.java
@ConfigurationProperties(prefix="app") public class Team { private String team; private int teamSize; private String teamLeader; private Company company; private List<Employee> employees; private Map<String, String> technologies; private String[] clients; //Setters and Getters public String toString() { return "Team:" + team + " - " + teamSize + " - " + teamLeader; } }
@ConfigurationProperties
, we need to use @EnableConfigurationProperties
annotation in conjunction with @SpringBootApplication
and specify above class to it.
MySpringBootApp.java
package com.concretepage; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ApplicationContext; @SpringBootApplication @EnableConfigurationProperties(Team.class) public class MySpringBootApp { public static void main(String[] args) { final ApplicationContext ctx = SpringApplication.run(MySpringBootApp.class, args); ------ } }
Using @Validated with @ConfigurationProperties
The values injected from property file to class using@ConfigurationProperties
can be validated with Spring @Validated
annotation.
Team.java
package com.concretepage; import java.util.List; import java.util.Map; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.format.annotation.NumberFormat; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; @Component @ConfigurationProperties(prefix="app") @Validated public class Team { @NotBlank private String team; @NumberFormat private int teamSize; @Size(max=30) private String teamLeader; @NotNull private Company company; @NotEmpty private List<Employee> employees; @NotEmpty private Map<String, String> technologies; private String[] clients; //Setters and Getters public String toString() { return "Team:" + team + " - " + teamSize + " - " + teamLeader; } }
Maven
Find the Maven used in our example.pom.xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath /> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.16.Final</version> </dependency> </dependencies>
YAML File
Find the YAML file equivalent to property file used in our example.application.yml
app: team:XYZ Team team-size:3 team-leader:Mahesh employees: - name:Amar designation:Developer age:25 - name:Akbar designation:Tester age:23 - name:Anthony designation:Designer age:27 technologies: BACKEND:Java FRONTEND:Angular DATABASE:Oracle clients: - A Client - B Client - C Client company: name:ABC Ltd ceo:Narendra location:Delhi project: project-name:PQR Project size:10 manager:John