Spring Boot @ConfigurationProperties example

摘要: Spring Boot @ConfigurationProperties is letting developer maps the entire .properties and yml file into an object easily.

Spring Boot @ConfigurationProperties is letting developer maps the entire .properties and yml file into an object easily.

P.S Tested with Spring Boot 2.1.2.RELEASE

1. @Value

1.1 Normally, we use the @Value to inject the .properties value one by one, this is good for small and simple structure .properties files. For example,

global.properties
email=test@mkyong.com
thread-pool=12
GlobalProperties.java
@Component
@PropertySource("classpath:global.properties")
public class GlobalProperties {
    @Value("${thread-pool}")
    private int threadPool;
    @Value("${email}")
    private String email;
    //getters and setters

1.2 The equivalent in @ConfigurationProperties

GlobalProperties.java
import org.springframework.boot.context.properties.ConfigurationProperties;
@Component
@PropertySource("classpath:global.properties")
@ConfigurationProperties
public class GlobalProperties {
    private int threadPool;
    private String email;
    //getters and setters

2. @ConfigurationProperties

2.1 Review a complex structure .properties or yml file below, how we are going to map the values via @Value?

application.properties
#Logging
logging.level.org.springframework.web=ERROR
logging.level.com.mkyong=DEBUG
#Global
email=test@mkyong.com
thread-pool=10
#App
app.menus[0].title=Home
app.menus[0].name=Home
app.menus[0].path=/
app.menus[1].title=Login
app.menus[1].name=Login
app.menus[1].path=/login
app.compiler.timeout=5
app.compiler.output-folder=/temp/
app.error=/error/

or the equivalent in YAML.

application.yml
logging:
  level:
    org.springframework.web: ERROR
    com.mkyong: DEBUG
email: test@mkyong.com
thread-pool: 10
app:
  menus:
    - title: Home
      name: Home
      path: /
    - title: Login
      name: Login
      path: /login
  compiler:
    timeout: 5
    output-folder: /temp/
  error: /error/
Note
@ConfigurationProperties supports both .properties and .yml file.

2.2 @ConfigurationProperties comes to rescue :

AppProperties.java
package com.mkyong;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@ConfigurationProperties("app") // prefix app, find app.* values
public class AppProperties {
    private String error;
    private List<Menu> menus = new ArrayList<>();
    private Compiler compiler = new Compiler();
    public static class Menu {
        private String name;
        private String path;
        private String title;
        //getters and setters
        @Override
        public String toString() {
            return "Menu{" +
                    "name='" + name + '\'' +
                    ", path='" + path + '\'' +
                    ", title='" + title + '\'' +
                    '}';
    public static class Compiler {
        private String timeout;
        private String outputFolder;
        //getters and setters
        @Override
        public String toString() {
            return "Compiler{" +
                    "timeout='" + timeout + '\'' +
                    ", outputFolder='" + outputFolder + '\'' +
                    '}';
    //getters and setters
GlobalProperties.java
package com.mkyong;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties // no prefix, find root level values.
public class GlobalProperties {
    private int threadPool;
    private String email;
	//getters and setters

3. @ConfigurationProperties Validation

This @ConfigurationProperties support JSR-303 bean validation.

3.1 Add @Validated on the @ConfigurationProperties class, and javax.validation annotations on the fields we want to validate.

GlobalProperties.java
package com.mkyong;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
@Component
@ConfigurationProperties
@Validated
public class GlobalProperties {
    @Max(5)
    @Min(0)
    private int threadPool;
    @NotEmpty
    private String email;
    //getters and setters

3.2 Set thread-pool=10

application.properties
#Global
email=test@mkyong.com
thread-pool=10

3.3 Start Spring Boot and we will hits the following error message :

Console
***************************
APPLICATION FAILED TO START
***************************
Description:
Binding to target org.springframework.boot.context.properties.bind.BindException: 
	Failed to bind properties under '' to com.mkyong.GlobalProperties failed:
    Property: .threadPool
    Value: 10
    Origin: class path resource [application.properties]:7:13
    Reason: must be less than or equal to 5
Action:
Update your application's configuration

4. DEMO

$ git clone https://github.com/mkyong/spring-boot.git
$ cd externalize-config-properties-yaml
$ mvn spring-boot:run
access localhost:8080
Note
For more detail, please refer to this official Spring Boot Externalized Configuration

上一篇: Java 8 Math Exact examples
下一篇: Spring Boot SLF4j Logback example
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号