外部配置源与外部配置文件及JSON配置
application.properties application.yml 这些是配置文件,
命令行配置、环境变量配置、系统属性配置源,这些属于配置源。
外部配置源的作用:
Spring Boot相当于对Spring框架进行了封装,Spring Boot会自动配置大量的基础设置Bean(比如DataSource、SessionFactory等),此时就需要提供一些必要的配置信息(如URL、用户名、密码啊),这样Spring才能帮我们去自动配置。
▲ 配置源和配置文件
配置源包含了配置文件,此外,配置源还包括如下:- 环境变量
- 系统属性
- 命令行的选项参数
- JSON配置等
★ 外部配置源的加载顺序
▲ 加载顺序
(1)默认属性(通过SpringApplication.setDefaultProperties()方法指定)。
(2)配置类(@Configuration修饰的类)上的、用@PropertySource注解加载的属性文件中的属性值。
(3)配置文件(如application.properties文件等)。
(4)RandomValuePropertySource,只包含random.*中的属性。
(5)操作系统环境变量。
(6)Java系统属性(System的getProperties()方法返回的属性)。
(7)来自于 java:comp/env 的JNDI属性。
(8)ServletContext的初始化参数(在web.xml文件中通过<context-param…/>元素设置的初始化参数)。
(9)ServletConfig的初始化参数(在web.xml文件通过<init-param…/>元素设置的初始化参数或通过@Servlet注解设置的初始化参数)。
(10)来自SPRING_APPLICATION_JSON的属性(嵌套在环境变量或系统属性中JSON文本)
(11)命令行参数。
(12)测试用例类上通过@SpringBootTest注解的properties所指定的属性。
(13)测试用例类上通过@TestPropertySource注解加载的属性文件中的属性值。
(14)如果Spring Boot的devtools工具处于激活状态,用户Home目录中.config/spring-boot/子目录下spring-boot-devtools.properties或spring-boot-devtools.yml文件设置的属性。
▲优先级
因为后加载的配置属性,会覆盖先加载的配置属性,因此后加载的配置属性的优先级更高
测试配置 > 命令行参数 > JSON配置 > 系统属性 > 环境变量 > 随机配置 > 配置文件 > 配置类 > 默认属性
★ 配置文件的加载顺序
配置文件是Spring Boot外部配置源中最主流、最主要的配置源。
▲ 基本原则:
JAR包外临时指定的配置文件的优先级高于JAR包内配置文件的优先级;
特定Profile对应的配置文件的优先级高于通用配置文件的优先级
▲ 加载顺序
(1)JAR包内的application.properties(或application.yml)。
(2)JAR包内的application-{profile}.properties(或application-{profile}.yml),这是特定Profile对应的配置文件。
(3)JAR包外临时指定的application.properties(或application.yml)。
(4)JAR包外临时指定的application-{profile}.properties(或application-{profile}.yml)。
因为后加载的配置属性,会覆盖先加载的配置属性,因此后加载的配置属性的优先级更高
★ JSON配置
所谓JSON配置,你可以通过任意配置源(如命令行参数、系统属性、环境变量等)方式配置一个名为spring.application.json(环境变量用SPRING_APPLICATION_JSON变量名)的属性, 该属性的值是一个JSON文档,Spring Boot会自动解析该JSON文档,将其解析成对应的属性。
【注意:】JSON文档需要放在引号中,因此JSON文档的内容中双引号往往就需要转义。
▲ Spring Boot应用会自动解析JSON配置值,将该配置的属性值按JSON格式解析成多个属性值,传给Spring Boot应用
代码演示:
演示项目如何在启动类写Json格式,然后解析JSON格式的数据并赋值给springboot应用
//=============演示项目如何解析启动类这里配置的json数据===========================System.setProperty("spring.application.json","{ \"user\" : { \"name\":\"ljh\" , \"age\":25 , \"addrs\":[\"广州\",\"深圳\"] }}" );ConfigurableApplicationContext ctx =SpringApplication.run(BootApplication.class, args);
演示通过命令行配置Json格式的选项参数,再解析
这个是没有把启动类的json数据注释掉,如上面的数据,然后启动,发现在命令行设置json的数据可以被读取到。
但是如果我把启动类上的System.setProperty(“spring.application.json”,
“{ “user” : { “name”:“ljh” , “age”:25 , “addrs”:[“广州”,“深圳”] }}” ); 这个注释掉,再启动老是报age的错。
如图:不理解。JSON格式应该是没问题的。