一文读懂springboot配置和最佳实践
#前言
相信在阅读本文前,大家在开发过程中已经或多或少的接触过程序配置这个概念,比如数据库链接配置、线程池配置、日志文件配置等。这些配置有多种多样的表现形式,或者是通过静态常量的方式在代码中声明并引用,或者是通过动态配置中心实现分布式配置管理,或者是通过环境变量和程序启动参数。上面讲的概念大家或许熟悉或许陌生,但是已经足以说明配置方式的多样性。再加上如今互联网推行敏捷研发流程,程序从研发到上线要经历多套环境,这些环境之间的配置往往不同,比如需要访问不同的数据源,或者是打印不同级别的日志。springboot就针对多环境的特性提供了支持多套配置文件的方案,从而使得同一套代码在不同的环境下用不同的配置运行。
与此同时,这也增加了配置的复杂度。不知你是否也曾经打开一个Spring项目,看到里面一堆配置文件,完全不知道当前生效的是哪个配置文件,或者某一个变量在特定场景下的取值。本文就将对SpringBoot的配置文件进行介绍,它将帮助你:
- 搭建一个读取配置文件的SpringBoot项目
- 了解SpringBoot支持的多种配置文件类型和解析变量类型
- 了解多配置文件场景下配置的优先级
- 其它高级玩法
快速上手
demo地址:
假设我们现在需要声明一个变量databaseUrl,并且需要在代码中读取这个变量来连接数据库,伪代码如下:
1 | JDBC.createConnection("mysql", ${databaseUrl}); |
那么我们首先需要在application.properties文件中声明这个变量并赋值:
1 | todo |
接着我们需要在代码中访问这个变量的值,spring提供了多种方式来访问配置信息,这里先介绍最常用的一种,通过在属性上引入@Value注解来注入属性值,代码如下:
1 | todo |
这里要注意@Value一定是在Spring上下文中才会生效,如果当前的类没有通过@Component等注解注册为SpringBean的话,该配置不会生效。而访问配置的代码就十分简单,直接在bean中引用该属性即可获得配置的值。
但是,上面这段逻辑,在代码中使用静态变量也能够起到同样的效果,何须那么麻烦的单独抽出一个配置文件来管理数据库链接信息。这里就要引入Spring Properties的真正使用场景:在不同的环境中
properties or yaml
配置注入的N种方法
基础玩法
多种类型映射和类型校验
配置文件优先级
支持的配置渠道包括properties文件,yaml文件,环境变量和命令行参数
常用的配置
高级玩法
随机数
自定义转换器
通用实践
笔记:
- java -jar app.jar –name=”Spring”
- 命令行参数配置的优先级要高于文件配置 SpringApplication.setAddCommandLingProperteis(false)关闭注入命令行参数