配置文件
- Spring Boot 使用一个全局配置文件,文件名是固定的,有两种格式:
- applicatation.properties
- applicatation.yml
配置文件放在src/main/resources目录,或者类路径/config下;
作用:修改Spring Boot自动配置的默认值,Spring Boot在底层都自动配置好;
- YAML语言,以数据为中心,比json,xml等更适合做配置文件
语言规范参考官方文档:yaml.org/
- YAML基本语法
key: value 表示一对键-值对,冒号后面的空格必须有,如port: 8081
以空格的缩进来控制层级关系,只要是左对齐的一列数据,都属于一个层级;属性和值也是大小写敏感。
value的类型
字符串:默认不需要加单引号或者双引号
对象:可以采用缩进,也可以用行内
数组:可以采用短横线写法,也可以用行内
name: "zhangsan \n shanghai" 输出: zhangsan 换行 shanghai
name: 'zhangsan \n shanghai' 输出: zhangsan \n shanghai
friends:
lastName: zhang
firstName: san
age: 20
friends: {lastName: zhang,age: 20}
pets:
- cat
- dog
- pig
pets: [cat,dog,pig]
- application.yml配置文件值注入
1. JavaBean类头部加注解@ConfigurationProperties(prefix = "some_key"),可以将配置文件中配置的每一个属性的值映射到这个组建中;前提是先用@Component把这个javaBean注册成一个Spring的组件。
2. Spring底层注解:@Value 也可以获取配置文件中的值,加在类成员上
@Value("${friends.lastName}")
String lastName;
注意:@Value注解只能指定单个field的值,并且不支持松散绑定(lastName和last-name匹配)
二者区别:(参考:blog.csdn.net/u014745069/…
@PropertySource
作用:加载指定的配置文件
@PropertySource("classpath:person.properties")
上述代码加载类路径下的,person.properties中的配置
更多参考:www.baeldung.com/spring-yaml…
@ImportResource
导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,用@ImportResource标注在一个配置类上,加载进配置文件。
@ImportResource(locations = ["classpath:person.properties"])
Spring Boot 推荐给容器中添加组件的方式来加载,用@Bean标注组件。
Profile
Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、制定参数等方式快速切换环境,3种方式:
1. 多profile文件形式,格式为 application-{profile}.properties
2. 多profile文档块模式,保存在同一文件中,不同环境用横线隔开
3. 激活方式
命令行:--spring.profiles.active=dev
配置文件:spring.profiles.active=dev (在application.properties中指定)
jvm参数:-Dspring.profile.active=dev 在下图中的VM options中指定环境也可以
打包完成后,在terminal用:
java -jar Demo-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
配置文件加载位置
Spring Boot启动会扫描一下位置的application.properties作为Spring Boot默认配置文件
- file:./config/ (根目录下面创建config文件夹,权限最高)
- file:./
- classpath:/config/ (resources下面创建config文件夹)
- classpath:/ (resources下面直接放--常用)
以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级的配置内容。互补配置。
项目打包以后,我们可以使用命令行参数的形式,启动项目时指定配置文件位置:
java -jar Demo-0.0.1-SNAPSHOT.jar --spring.config.location = G:/application.properties
运维时,常用上述命令指定配置文件的位置,优先级最高,与其他配置文件互补配置。
外部配置加载顺序
官方参考:docs.spring.io/spring-boot…
Spring Boot也可以从以下位置加载配置,优先级从高到低,见下图,覆盖,同时实现互补配置。
自动配置原理
官方文档docs.spring.io/spring-boot…指定了所有可以写在application.yml中的属性。
1. Spring Boot启动时,加载主配置类,开启了自动配置功能@EnableAutoConfiguration
2. @EnableAutoConfiguration作用:
利用EnableAutoConfigurationImportSelector给容器中导入一些组件
- 扫描所有jar包类路径下META-INF/spring.factories
- 把扫描到的这些文件的内容包装成properties对象
- 从properties中获取到EnableAutoConfiguration.class类的值,把他们添加在容器中
总结:就是将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到容器中。如下图所示,展示了autoconfigure里一小部分值
3. 每一个自动配置类,进行自动配置功能
进行自动配置时,根据当前不同的条件@Condition判断,决定这个配置类是否生效。一旦配置类生效,他就会给容器中添加各种组件,这些组件的属性从对应的properties中获取,这些类里面的每一个属性又是和配置文件绑定的。
注意@Condition是Spring框架的注解,有其他很多派生注解
精髓:
1. SpringBoot启动会加载大量的自动配置类
2. 我们看我们需要的功能有没有Spring Boot默认写好的自动配置类
3. 再来看这个自动配置类中到底配置了哪些组件xxxAutoConfiguration.class
4. 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以通过修改配置文件中指定这些属性的值来实现手动修改默认配置
自动配置报告:
可以在application.properties配置文件中启用debug=true属性(默认为false),可以在程序启动后,在控制台打印出auto-configuration report, 可以看哪些自动配置起作用了。
Reference: