springboot批量讀取參數映射到實體類


spring讀取配置參數可以通過${name}的方式獲取,如properties文件中存在如下配置

person.username=xi

則可通過${person.username}獲取其對應的值xi

@value("${person.username}")
private String name;

但如果參數過多,在使用這種方式配置,就比較麻煩,springboot中新添加了一個注解@ConfigurationProperties,可以批量將配置參數映射到實體類中。添加依賴,如果不加,代碼中會給出黃色提示

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-configuration-processor</artifactId>
     <optional>true</optional>
</dependency>

假設當前存在一個工廠的配置如下

com.demo.factory.name=Furniture Factory
com.demo.factory.addr=bj sy
com.demo.factory.props.work-time=8:00-20:00
com.demo.factory.props.maintenance-time=3 years

com.demo.factory.type[0]=table
com.demo.factory.type[1]=chair
com.demo.factory.type[2]=sofa
com.demo.factory.type[3]=bed

com.demo.factory.desc=${com.demo.factory.name} address: ${com.demo.factory.addr}, working time: ${com.demo.factory.props.work-time}, product type includ: ${com.demo.factory.type[1]} 

其中,desc中使用了當前配置文件中的參數,props可以看成是一個map,type是一個list集合

對應的實體類為

package com.springbootdemo;

import java.util.List;
import java.util.Map;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("com.demo.factory")
public class Factory {

    private String name;
    private String addr;
    private Map<String, String> props;
    private List<String> type;
    private String desc;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    public Map<String, String> getProps() {
        return props;
    }

    public void setProps(Map<String, String> props) {
        this.props = props;
    }

    public List<String> getType() {
        return type;
    }

    public void setType(List<String> type) {
        this.type = type;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Factory [name=" + name + ", addr=" + addr + ", props=" + props + ", type=" + type + "]";
    }

}

測試,實現CommandLineRunner 的類,被納入到spring管理后,程序啟動之后就會執行該類中的run方法

package com.springbootdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class MainBusi implements CommandLineRunner {

    @Autowired
    private Factory factory;

    @Override
    public void run(String... args) throws Exception {
        System.out.println(factory);
        System.out.println(factory.getDesc());
    }

}

上述兩行打印輸出的結果如下

Factory [name=Furniture Factory, addr=bj sy, props={work-time=8:00-20:00, maintenance-time=3 years}, type=[table, chair, sofa, bed]]
Furniture Factory address: bj sy, working time: 8:00-20:00, product type includ: chair 

關於配置文件中參數對應到實體類中的屬性,springboot有如下規則可參考

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM