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有如下規則可參考