二、SpringBoot的配置--yaml
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
YAML 是一个标记语言
标记语言:
以前的配置文件;大多都使用的是xxx.xml文件
YAML:以数据为中心,比json、xml等更适合做配置文件
YAML:配置例子
XML:
k:(空格)v : 表示一对键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感;
k: v :字面直接来写;
字符串默认不用加上单引号或者双引号;
"" :双引号;不会转义字符串里面的特殊字符; 特殊字符会作为本身想表示的意思
name : "zhangsan \n lisi" :输出 : zhangsan 换行 lisi
'' :单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: 'zhangsan \n lisi' : 输出 ; zhangsan \n lisi
k: v : 在下一行来写对象的属性和值的关系 ;注意缩进
对象还是 k: v 的方式
行内写法:
用- 值表示数组中的一个元素
行内写法
配置文件
javaBean:
我们可以导入配置文件处理器,以后编写配置就有提示了
调整 图示:
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
如果说,我们专门编写一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效
SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
不来编写Spring的配置文件
Spring Boot推荐给容器添加组件的方式;推荐全注解的方式
1、配置类@Configuration------Spring配置文件
2、使用@Bean给容器中添加组件
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml
默认使用application.properties的配置
1、在配置文件中指定spring.profiles.active=dev
2、在命令行:
java -jar spring-boot-02-config.jar --spring.profiles.active=dev;
可以直接在测试的时候,配置传入命令行参数
3.虚拟机参数
-Dspring.profiles.active=dev
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring Boot的默认配置文件
-file:./config/
-file:./
-classpath:/config/
-classpath:/
优先级由高到低,高优先级的配置会覆盖低优先级的配置
SpringBoot会从这四个位置加载主配置文件:互补配置
==我们还可以通过spring.config.location来改变默认的配置文件位置==
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用互补配置;
java -jar spring-boot-02-config.jar --spring.config.location=G:/application.properties
==SpringBoot也可以从以下位置加载配置;优先级从高到低;高优先级的配置低优先级的配置,所有的配置会形成互补配置==
1.命令行参数
2.来自java:comp/env的JNDI属性
3.java系统属性
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
==有jar包外箱jar包内进行寻找==
==优先加载带profile==
6.jar包外部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件
==再来加载不带profile==
8.jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
精髓:
1》springboot启动会加载大量的自动配置类
2》我们看我们需要的功能有没有springboot默认写好的自动配置类
3》我们再来看这个自动配置类中到底配置了那些组件;(只要我们要用的组件有,我们就不需要再来配置了)
4》给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值
Spring Boot 配置在系统环境变量中的写法
Spring Boot 通常都会用到 properties,并且可以被定义在很多地方。除了最常见的 .properties 文件,
.yml 文件:
还有 Command Line 还有环境变量等等。其中作为环境变量(也就是 OS Environment Varibles)时写法上会有讲究,如上的格式将不再可用。通常我们会忽视驼峰全用大写,并用下划线代替点,其他如短横线则保留原样,比如上述配置如果配置到环境变量,则写法如下:
SpringBoot 配置文件详解(告别XML)
快速学会和掌握 SpringBoot 的 核心配置文件的使用。
SpringBoot 提供了丰富的 外部配置 ,常见的有:
其中核心配置文件我们并不陌生,主要以Key-Value的形式进行配置,其中属性Key主要分为两种:
在 application.properties 添加配置如下:
① 添加数据源信息
在 application.propertis 添加配置如下:
① 添加认证信息,其中 socks.indentity.* 是自定义的属性前缀。
② 添加随机值,其中spring.test.* 是自定义的属性前缀。
使用方法: @ConfigurationProperties(prefix = "spring.datasource")
使用说明:提供 Setter方法 和 标记组件 Component
如何验证是否成功读取配置?答:这里可以简单做个验证,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:
使用方法: @Value("spring.datasource.*")
使用说明:提供 Setter方法 和 标记组件 Component
注意事项:@Value不支持注入静态变量,可间接通过Setter注入来实现。
关于两者的简单功能对比:
显然,前者支持松绑定的特性更强大,所以在实际开发中建议使用@ConfigurationProperties来读取自定义属性。
SpringBoot 默认会加载这些路径加载核心配置文件,按优先级从高到低进行排列:具体规则详见 ConfigFileApplicationListener
如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出:
举个简单的例子,例如再上述位置都有一个application.properties ,并且每个文件都写入了server.port=xx (xx分别是9001,9002,9003,9004),在启动成功之后,最终应用的端口为:9004。图例:
如果想修改默认的加载路径 或者 调改默认的配置文件名,我们可以借助命令行参数进行指定,例如:
YAML是JSON的一个超集,是一种可轻松定义层次结构的数据格式。
答: 因为配置文件这东西,结构化越早接触越规范越好。这里推荐阅读阮一峰老师写的 YAML语言教程 ,写的很简单明了。
引入依赖: 在POM文件引入 snakeyaml 的依赖。
使用说明: 直接在类路径添加 application.yml 即可。
例如下面这两段配置是完全等价的:
① 在 application.yml 配置数据源:
② 在 application.properties 配置数据源:
在项目的实际开发中,我们往往需要根据不同的环境来加载不同的配置文件。例如生产环境,测试环境和开发环境等。此时,我们可以借助 Profiles 来指定加载哪些配置文件。例如:
温馨提示:如果spring.profiles.active指定了多个配置文件,则按顺序加载,其中最后的优先级最高,也就是最后的会覆盖前者。
使用方法:
使用Maven插件打包好项目,然后在当前路径,执行DOS命令: java -jar demo.jar --server.port=8081 ,在控制台可看到应用端口变成了8081。
实现原理:
默认情况下,SpringBoot会将这些命令行参数转化成一个 Property ,并将其添加到 Environment 上下文。
温馨提示:
由于命令行参数优先级非常之高,基本高于所有常见的外部配置,所以使用的时候要谨慎。详见 PropertySource 执行顺序 。
关闭方法:
如果想禁用命令行属性,可以设置如下操作:springApplication.setAddCommandLineProperties(false)
Spring Boot 配置的优先级
本文主要参考 Externalized Configuration
为了能让应用在不同的环境下运行,Spring Boot允许自定义配置文件,如properties文件、yaml文件、系统环境变量参数、命令行参数。配置文件的覆盖优先级如下
Developer Tools 提供了一些开发帮助工具,在build.gradle添加依赖后启用。
Spring Boot会读取在计算机用户的home目录下的 .spring-boot-devtools.properties 文件里的配置参数到该计算级的所有Spring Boot应用中作为顶层配置,如Linux环境下root用户下 ~/.spring-boot-devtools.properties 文件。开发过程中,可以将一些个人参数记录在这个配置文件中,例如ip地址,机器uuid,datasource参数等。在该配置文件中的定义的配置环境并不会影响到应用配置的读取,官方原话是:
但要注意,该配置优先级最高,设置的时候需要做好记录否则会出现"原因不明的bug",不过应该很少人会用到这个功能。分析下源码,就是加了一个配置切面,并把其设置为顶层配置:
在测试的时候,可能会使用另一套测试专用的配置,该套配置的优先级高于系统环境变量、java系统参数、程序内部参数, @TestPropertySource 注解就是用来指定这一类配置的。该注解一共有5个参数可以设置:
如果使用注解的时候没有任何参数,那么会从标注了注解的测试类的包中尝试读取配置文件,例如测试类 com.spring.test.DemoTest ,那么相应的默认配置文件为 com.spring.test.DemoTest.properties ,如果没有找到默认的配置文件则抛出非法状态异常。
AbstractTestContextBootstrapper 在初始化上下文的时候会调用一个读取、合并配置的方法 buildMergedContextConfiguration ,该方法通过工具类 TestPropertySourceUtils 读取类的注解信息。 TestPropertySourceUtils 从类的注解解析配置信息后返回一个可合并的配置源。
@SpringBootTest 的value\properties属性用于注入一些自定义的注解,语法要求和 @TestPropertySource 的properties一样,这里就不详细展开了。
用命令行方式启动Spring Boot应用程序的时候,可以注入一些配置参数,参数的格式是 --key=name 。举个简单的例子,程序直接输出一个参数,然后打成jar包后运行。
运行:
java -jar .\springbootconfiguraiton.jar --cl.name="Spring Boot Arguments"
从输出的结果中可以看到可以读取到命令行中的配置。
可以在环境变量中定义一个key为SPRING_APPLICATION_JSON的参数,值为json字符串,Spring Boot会解析该json字符串作为参数注入到系统中。SPRING_APPLICATION_JSON可以定义在环境变量、系统配置中,命令行也是可以的,例如命令行参数中用到的demo,执行以下的命令也应该能得到相同的参数结果。
java -jar .\springbootconfiguraiton.jar SPRING_APPLICATION_JSON='{"cl":{"name"="Spring Boot Arguments"}}'
结果输出是undefined,不知道原因,这个配置方式用的应该也很少,放弃研究。。。
优先级是 ServletConfig ServletContext ,可以在application.yml中设置:
随机数配置大多用于测试,支持的类型如下:
其中long\int可以限制数据范围,[]是闭区间,()是开区间。
这个应该是我们用的最多的。首先说优先级,文件可以放在以下4个位置,相同文件从上到下覆盖。外部指的是启动应用程序的目录,例如gradle用application插件打包后,运行的脚本目录就是 ./ :
文件的命名为 application-[当前激活的环境名].[yml/properties] ,当前激活的配置可以用 spring.profile.active=[当前激活的环境名] 定义,多个环境名用逗号分隔,未设置时用 default 标识。关于如果修改默认的加载路径和文件名,后面会继续讨论。
Spring Boot系统启动时默认会读取的配置文件,支持properties\yml格式。也就是说,会先加载 application.properties ,根据 spring.profile.active 的设置加载相应的 application-XX.properties 配置,然后按优先级合并配置文件。
不同文件目录下application.properties的优先级和 自定义配置文件 的顺序是一样的。
类似 @TestPropertySource注解 ,在项目中可以方便的注入自定义的配置文件,注解一共有5个参数:
Spring Boot - 多环境配置
在项目开发时,我们经常需要在不同的运行环境中进行切换,典型的场景包括: 开发环境 dev , 测试环境 test 以及 发布环境 prod 。
不同的环境可能会对应不同的配置内容,如果手动更改运行环境配置,会显得非常繁琐与低效。
因此,Spring Boot 提供了一套机制可以很容易地让我们进行多环境配置。
假设现在我们需要往返于两个运行环境: 开发环境 dev 和 测试环境 test 。
Spring Boot 提供了一套多环境配置机制,称为: Profile-specific Properties ,可以将其理解为 环境相关配置文件 。
Profile-specific Properties 多环境配置的具体步骤如下所示:
以上,我们就完成了多环境配置,运行程序,结果如下:
可以看到,成功运行在开发环境 dev 中,并且相应的配置选项也生效了。
注 :如果没有指定具体环境配置文件,那么 Spring Boot 默认加载 application-default.properties 配置文件,相当于 application.yml 默认配置选项:
除了上述最为推荐的方式进行多环境配置外,Spring Boot 还提供了许多其他方式进行配置,下面简单介绍几种:
注 :当开启了多个运行环境时,最终的配置由最后一个环境决定。
比如, spring.profiles.active 属性加载晚于 SpringApplication 相关 API 设置,因此其指定的环境配置文件中的配置生效。