SpringBoot文章目录
文章目录
- 前言
- 四、配置文件加载顺序
- 五、自动配置原理
前言
上一讲讲到了SpringBoot的注解以及配置文件,这一讲就来讲解一下配置文件的加载顺序
四、配置文件加载顺序
1)内部配置文件的加载顺序
SpringBoot启动扫描一下位置的application.properties或者applicatiob.yml文件作为SpringBoot的默认配置文件(以下按照优先级从高到低的顺序,所有文件都会被加载,高优先机配置内容会覆盖低优先级配置)
解释:config代表包名 ./表示项目目录下
——file: ./config/
——file: ./
——classpath: /config
——classpath: /
SpringBoot会从以上四个位置全部加载主配置文件:配置互补
ps:也可以通过配置spring.config.location来改变默认配置
项目打包之后,我们可以使用命令行参数的形式,启动项目的时候来制定配置文件的新位置;指定的配置文件和默认加载的配置文件共同起作用形成配置互补(打包使用package进行打包)
java -jar XXX --spring.config.location=AAA
//XXX表示打包完成的项目jar名 一般在控制启动台可查看
//AAA表示新的配置文件
//这种操作就不需要在醒目项目打包完成之后修改内部配置直接可在打包之后修改配置
2)外部配置文件的加载顺序
同理,高优先级到低优先级,配置互补
1、命令行配置(XXX表示某个项目给打成jar包形式.jar)
//修改单个参数配置
java -jar XXX --server.port=8087
//若存在多个修改参数的配置 使用空格进行多个参数设置
java -jar XXX --server.port=8087 --serve.context-path=/springboot
2、来自java:comp/env的NDI属性
3、java系统属性(System.getProperties[])
4、操作系统环境变量
5、RandomValuePropertySource配置的random.*属性值
6、jar包外部的application-{profile}.properties.yml(带spring.profile)配置文件
7、jar包外部的application-{profile}.properties.yml(带spring.profile)配置文件
8、jar包外部的application.properties.yml(不带spring.profile)配置文件
9、jar包内部的application.properties.yml(不带spring.profile)配置文件
(ps:补充总结:有jar包外向jar包内进行寻找,优先加载带profile)
10、@Configuration注解类上的@PropertySource
11、通过SpringAppliaction.setDefaultProperties指定的默认属性
总结:所有的支持的配置加载来源参考官方文档:
五、自动配置原理
1)SpringBoot启动时会加载主配置类(利用@SpringBootApplication 表示该类为主配置类),主配置类开启了了自动配置功能@EnableAutoConfiguration(参考第一讲的重要注解讲解)
@EnableAutoConfiguration作用:
1)进一步查看该方法的内容:
利用注解接口的 @Import(EnableAutoCongurationImportSelector.class)给容器中导入一些组件
2)进一步查看selectImport()方法
List<String>configuartions = getCandidateConfiguration(annotationMetadata,attributes);//获取候选的配置
4)进一步查看该方法的内容:
SpringFactoriesLoader.loadFactoryNames()
扫描所有jar包类路径下 NETA-INF/spring.factories
扫描到的文件内容包装成properties
把properties中获取到的EnableAutoConguration.class类(类名)对应的值添加到容器中
ps:每一个这样的XXXAutoConfiguration类都是容器的一个组件,都加载到容器中,才会开始自动配置。
2)每一个自动配置类进行自动配置功能
//示例Http编码自动配置
@Configuration//表示这是一个配置类
@EnableConfigurationProperties(HttpEncodingProperties.class)//启用对应类ConfigurationProperties功能 将配置文件的值和Properties绑定
@ConditionalWebApplication//Spring底层@Conditionl注解(根据不同的条件,满足指定的配置则配置会生效(示例:判断当前应用是否为web,如果是配置类生效反之则不))
@ConditionalOnClass(CharacterEncoding.class)//判断当前项目是否存在该类(示例:springMVC进行乱码解决的过滤器)
@ConditionalOnProperties(prefix="spring.http.encoding",value="enabled".matchIfMissing=true)//判断是否存在某个配置(示例:spring.http.encoding.enabled即使不配置也生效)
public class HttpEncodingConfiguration{
//内部已经和SpringBoot的配置文件映射了
......
}
//进一步解释
@ConfigurationProperties(prefix="spring.http.encoding")//从配置文件获取指定的值和bean属性进行类绑定
public class HttpEncodingProperties{
public static final Chaset DEFAULT_CHARSET = Charset.forName("UTF-8");
......
}
ps:1)根据当前配置不同条件来判断配置是否生效。一旦配置类生效,就会给容器中添加各种组件。组件的各种属性对应于properties。
2)所有的配置文件能配置的属性都是在XXXProperties类中封装,配置文件能配置什么需参照这个对应的属性类(简而言之:能配置的属性来源于对应的Proerties)
总结:
1)SpringBoot启动会加载大量的自动配置类
2)自动配置类中是否存在我们需要的组件。若已经有,则我们无需进行配置。
3)容器中自动配置类添加组建的时候,是从对应配置类的properties中获取某些属性,进而我们可以再配置文件中指定这些属性的值。
XXXAutoConfiguration---自动配置类
XXXProperties---封装配置文件中存在的相关属性