一文读懂springboot配置和最佳实践

#前言
相信在阅读本文前,大家在开发过程中已经或多或少的接触过程序配置这个概念,比如数据库链接配置、线程池配置、日志文件配置等。这些配置有多种多样的表现形式,或者是通过静态常量的方式在代码中声明并引用,或者是通过动态配置中心实现分布式配置管理,或者是通过环境变量和程序启动参数。上面讲的概念大家或许熟悉或许陌生,但是已经足以说明配置方式的多样性。再加上如今互联网推行敏捷研发流程,程序从研发到上线要经历多套环境,这些环境之间的配置往往不同,比如需要访问不同的数据源,或者是打印不同级别的日志。springboot就针对多环境的特性提供了支持多套配置文件的方案,从而使得同一套代码在不同的环境下用不同的配置运行。

与此同时,这也增加了配置的复杂度。不知你是否也曾经打开一个Spring项目,看到里面一堆配置文件,完全不知道当前生效的是哪个配置文件,或者某一个变量在特定场景下的取值。本文就将对SpringBoot的配置文件进行介绍,它将帮助你:

  1. 搭建一个读取配置文件的SpringBoot项目
  2. 了解SpringBoot支持的多种配置文件类型和解析变量类型
  3. 了解多配置文件场景下配置的优先级
  4. 其它高级玩法

快速上手

demo地址:

假设我们现在需要声明一个变量databaseUrl,并且需要在代码中读取这个变量来连接数据库,伪代码如下:

1
JDBC.createConnection("mysql", ${databaseUrl});

那么我们首先需要在application.properties文件中声明这个变量并赋值:

1
2
todo

接着我们需要在代码中访问这个变量的值,spring提供了多种方式来访问配置信息,这里先介绍最常用的一种,通过在属性上引入@Value注解来注入属性值,代码如下:

1
todo

这里要注意@Value一定是在Spring上下文中才会生效,如果当前的类没有通过@Component等注解注册为SpringBean的话,该配置不会生效。而访问配置的代码就十分简单,直接在bean中引用该属性即可获得配置的值。

但是,上面这段逻辑,在代码中使用静态变量也能够起到同样的效果,何须那么麻烦的单独抽出一个配置文件来管理数据库链接信息。这里就要引入Spring Properties的真正使用场景:在不同的环境中

properties or yaml

配置注入的N种方法

基础玩法

多种类型映射和类型校验

配置文件优先级

支持的配置渠道包括properties文件,yaml文件,环境变量和命令行参数

常用的配置

高级玩法

随机数

自定义转换器

通用实践

笔记:

  1. java -jar app.jar –name=”Spring”
  2. 命令行参数配置的优先级要高于文件配置 SpringApplication.setAddCommandLingProperteis(false)关闭注入命令行参数