详解SpringBoot配置文件properties和yaml

常用的配置文件,有两种格式:application.properties 和 application.yaml 两种类型的文件,除了写法不同之外,用法基本相同,其中.yaml文件需要注意的是在:后面要有一个空格,如user: wdy

本节使用 .properties文件介绍。

位置

SpringApplication 加载配置文件的路径和顺序如下:

  • /config/application.properties :在jar包所在目录的子目录config下

  • application.properties :在jar包所在目录下

  • classpath:/config/application.properties :在类路径的子目录config下

  • classpath:/application.properties :在类路径下

以上位置是配置文件自动加载的位置,并且按照1-2-3-4的顺序查找,所以这四个位置的优先级:1>2>3>4,先到先得。

通常在开发环境中,会把配置文件放在3、4位置,在生产环境放在1、2位置,因为1、2位置是jar包外面,修改比较方便,3、4需要重新打包。

上述位置可能不好理解,下图展示这四个文件的位置:

​上图是 jar包外 配置文件所在位置图

​上图是 jar包内 配置文件所在位置图

​上图是IDE中 配置文件 所在位置图(对应jar包内)

自定义位置

其中文件名是固定的,当然也是可以修改的,但是在运行Application时,必须指定修改后的名称,否则找不到,如下:

java -jar yourjavaproj.jar --spring.config.name=yourconfigname 复制代码

以上四个位置,是默认的加载位置,当然也允许放在其他位置,也必须指定修改后的位置,否则找不到,如下:

$ java -jar yourjavaproj.jar --spring.config.location=classpath:/config/yourjavaproj.properties,file:./platform/config/your.properties 复制代码
  • classpath:指的是Jar包内的classes路径下相对目录,即上图4位置;

  • file:./config 指的Jar所在路径,即上图1位置;

后面的会覆盖前面的,以下是官方给出的例子:

$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/ override.properties 复制代码

保留默认配置文件

有时候在项目中,可能会有一个默认的配置,如果没有个性化的配置,就加载这个文件,但是使用上述方式,文件不存在会报错,官方提供了另一个命令:

--spring.config.additional-location=file:./config/my.properties,如果该位置没有配置文件,会默认按照本文开始的4个位置加载配置文件。

还有一种情况,框架允许使用如下配置文件:

application-default.properties **名字不能修改,是框架默认的 复制代码

无论该文件位置本文开始描述的4个位置的何处,都会被优先加载,也就是说优先级最高。

配置文件的写法

.properties写法很简单,如下:

#修改启动时的端口为 888 server.port=8888 #自定义的信息:welcome.word welcome.word=hello world #自定义的信息,并且引用default-number配置的值20050630 welcome.number=${default-number} #自定义的信息:且值被welcome.number引用了 default-number=20050630 #定义一个数组 my.houses[0]=china.beijing my.houses[1]=china.shanghai 复制代码

yaml写法如下(再次强调在冒号后要有一个空格):

#修改启动时的端口为 888 server: port: 8888 #自定义的信息:welcome.word welcome: word: hello world #自定义的信息,并且引用default-number配置的值20050630 welcome: number: ${default-number} #自定义的信息:且值被welcome.number引用了 default-number: 20050630 #定义一个数组 my: houses: - china.beijing - china.shanghai 复制代码

代码中如何使用配置信息?如下:

@Component @ConfigurationProperties(prefix = "my") public class Config{ @Value("${welcome.word}") private String welcome_word; public String getWelcome_word(){return this.welcome_word;} //这里需要注意,使用@Value无法很好的解析数组等复杂对象,需要借助@ConfigurationProperties private List<String> houses; //Houses必须和配置文件中的houses一一对应 public List<String> getHouses(){return this.houses;} } 复制代码

在spring boot中还提供了一个更便捷的方式获取配置,下文介绍。

@ConfigurationProperties 优雅的加载配置文件

除了使用@Value之外,Spring Boot提供了一个@ConfigurationProperties注解加载配置,示例如下:

先看Yaml配置,如下:

my: user-name: wdy password: 123456 url: www.ylife.com 复制代码

编写对应的类

@Data @ConfigurationProperties("my") public class Yaml { // 注意:如果配置文件中有user-name格式的key,在类中使用userName驼峰写法 private String userName; private String password; private String url; } 复制代码

添加@ConfigurationProperties时,可能会提示: Spring Boot Configuration Annotation Processor not found in classpath 这个只是提醒,不影响正常使用,提醒的原因是该注解会默认到classpath:下查找yaml文件,没有显示指定路径导致

把Yaml类注解为Bean

@Configuration @EnableConfigurationProperties(Yaml.class) //就是这句话 public class Config { ... } 复制代码

如果不使用这种方式,也可以直接在class Yaml类上添加@Component注解,直接注册为Bean

使用

public class CommonController { @Autowired private Yaml config; } 复制代码

其实和@Value相比,层次少的使用@ConfigurationProperties更方便,层次深的使用@Value更方便.

另外说明,当存在多个profiles文件时:

在第2步中,如果用于接收配置的属性类型是List,那么List中只包含 active的配置数据;如果是Set类型,那么会合并多个profiles文件中的内容,相同的内容优先级最高的生效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值