Springboot 支持 properties 或者 yml 两种形式的配置文件,工程默认支持 application.properties 和 application.yml 两个配置文件,这个配置文件中的内容会自动加载。如果需要创建自定义的配置文件并实现加载,需要按照下面步骤操作。需要注意,自定义配置文件无法实现自动加载,需要手工加载。
自定义 properties 配置文件 配置文件有四个可以保存的位置:
项目的根目录下
项目根目录下的 config 文件夹
项目 src/main/resources 目录
项目 src/main/resources/config 目录
本工程基于一个简单的 springboot 启动程序作为开始,如果想了解如何初始化一个简单的 springboot 工程,可以参考 Springboot 工程创建入门 这篇文章。在本工程中,我们创建以下的目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 $ tree . . ├── pom.xml ├── src │ ├── main │ │ ├── java │ │ │ └── cn │ │ │ └── edulinks │ │ │ └── patrolselfservice │ │ │ ├── App.java │ │ │ ├── config │ │ │ │ └── ServerConfig.java │ │ │ └── controller │ │ │ └── ServerController.java │ │ └── resources │ │ ├── application.properties │ │ ├── patrolserver.properties │ └── test │ └── java │ └── cn │ └── edulinks │ └── patrolselfservice │ └── AppTest.java
项目的入口类是 App.java,在 resources 文件夹下创建了 patrolserver.properties 配置文件,记录了一些服务器相关的属性,对应的建立了一个配置类 ServerConfig.java,并在 ServerController.java 控制类中使用了相关的配置属性。
patrolserver.properties 配置文件代码如下:
1 2 3 4 patrolserver.ip = 127.0.0.1 patrolserver.hostname = mytestserver patrolserver.status = running patrolserver.port = 3381
ServerConfig.java 配置类代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 package cn.edulinks.patrolselfservice.config;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.PropertySource;import org.springframework.stereotype.Component;@Component @PropertySource(value = {"classpath:patrolserver.properties"}) @ConfigurationProperties(prefix = "patrolserver") public class ServerConfig { private String ip; private String hostname; private String status; private String port; @Override public String toString () { return "PatrolServer { ip = " + ip + ", hostname = " + hostname + ", status = " + status + ", port = " + port + "}" ; } public String getIp () { return ip; } public String getHostname () { return hostname; } public String getStatus () { return status; } public String getPort () { return port; } public void setIp (String ip) { this .ip = ip; } public void setHostname (String hostname) { this .hostname = hostname; } public void setStatus (String status) { this .status = status; } public void setPort (String port) { this .port = port; } }
ServerController.java 控制类代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package cn.edulinks.patrolselfservice.controller;import cn.edulinks.patrolselfservice.config.ServerConfig;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController @RequestMapping("/server") public class ServerController { @Value("${patrolserver.hostname}") private String hostname; @Resource private ServerConfig serverConfig; @RequestMapping(value = "/all", method = RequestMethod.GET) public String getServer () { System.out.println("server.host = " + serverConfig.getIp()); return serverConfig.toString(); } }
编译运行后访问 /server/all 可以看到如下输出
1 PatrolServer { ip = 127.0.0.1, hostname = mytestserver, status = running, port = 3381}
自定义 yml 配置文件 默认 ProperySource 不支持自定义的 yml 配置文件加载,需要编写一个单独的类,这里搬运了蚩尤后裔 提供的版本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 package jh.yysjzx.patrolselfservice;import org.springframework.boot.env.YamlPropertySourceLoader;import org.springframework.core.env.PropertySource;import org.springframework.core.io.support.DefaultPropertySourceFactory;import org.springframework.core.io.support.EncodedResource;import java.io.IOException;import java.util.List;public class PropertySourceFactory extends DefaultPropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException { if (resource == null ) { return super .createPropertySource(name, resource); } List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()); return sources.get(0 ); } }
参考 ServerConfig.java 配置类,在 config 文件夹下创建 SubsystemConfig.java 类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 package jh.yysjzx.patrolselfservice.config;import jh.yysjzx.patrolselfservice.PropertySourceFactory;import lombok.Data;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.stereotype.Component;@Component @PropertySource(value = {"classpath:subsystem.yml"}, factory = PropertySourceFactory.class) @ConfigurationProperties(prefix = "subsystem") public class SubsystemConfig { private String sysname; private String sysowner; private String sysgroup; public String getSysname () { return sysname; } public void setSysname (String sysname) { this .sysname = sysname; } public String getSysowner () { return sysowner; } public void setSysowner (String sysowner) { this .sysowner = sysowner; } public String getSysgroup () { return sysgroup; } public void setSysgroup (String sysgroup) { this .sysgroup = sysgroup; } @Override public String toString () { return "Subsystem { sysname = " + sysname + ", sysowner = " + sysowner + ", sysgroup = " + sysgroup + "}" ; } }
在 SystemController.java 类中调用使用的示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 package jh.yysjzx.patrolselfservice.controller;import jh.yysjzx.patrolselfservice.config.ServerConfig;import jh.yysjzx.patrolselfservice.config.SubsystemConfig;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.core.env.Environment;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;@RestController @RequestMapping("/system") public class SystemController { private Environment env; @Resource private SubsystemConfig subsystemConfig; @Value("${patrolserver.hostname}") private String hostname; @Value("${server.port}") private String serverPort; @Value("${subsystem.sysname}") private String sysname; @RequestMapping(value="/info", method = RequestMethod.GET) public String getInfo () { System.out.println("Here is system / info. " ); System.out.println(hostname); System.out.println(serverPort); System.out.println(sysname); System.out.println(subsystemConfig); return "ok" ; } }
多环境配置 Profile 的管理,配置文件指定,命令行指定
参考资料
Springboot 配置文件格式
Springboot 整合开发实战
springboot基础系列-properties配置
SpringBoot加载自定义配置文件
Springboot Documentation
Springboot 加载配置文件方式