SpringBoot配置和启动
本文最后更新于 2022年5月24日
1.内部配置加载顺序:
加载规则
- 加载顺序和优先级与配置文件所在路径有关
- 优先级高的配置会覆盖优先级低的配置,配置文件会全部加载,遇到相同的配置高优先级覆盖低优先级
- 命令行参数 –spring.config.location 自定义配置文件路径,可以与项目现有配置共存
优先级从高到低为
- /config
- /(根目录)
- classpath:/config
- classpath:/
2.外部配置加载顺序
相同配置高优先级覆盖低优先级,不同配置互补,优先级从高到低为
- 命令行参数
- jar包 外部的application.props/yml 带有spring.profile
- jar包 内部的application.props/yml 带有spring.profile
- jar包 外部的application.props/yml 不带有spring.profile
- jar包 内部的application.props/yml 不带有spring.profile
3.自动配置
- META/INF/spring.factories中EnableAutoConfiguration对应的所有类(自动配置类)加载到容器中,用它们来做自动配置
- 每个加载进来的配置类上的@EnableConfigurationProperties注解用来启用指定类的ConfigurationProperties功能,从配置文件获取指定的值和属性进行绑定
- @ConditionalOnWebApplication 判断如果是web应用则生效,否则不生效
- @ConditionalOnClass 判断当前项目是否有某个类
- @ConditionalOnProperty 判断配置文件是否有某个配置
总之注解根据不同条件判断,决定这个配置类是否生效
4 关于日志
4.1 常见框架(接口和实现)
- 常见抽象层接口:jcl(commons-logging) slf4j jboss-logging
- 常见日志实现:log4j logback jul(java.util.logging) log4j2
- springboot的默认选择日志组合 slf4j + logback
4.2 SpringBoot的日志配置
logging.file=spring.log
- 不指定路径就在当前项目下生成spring。log文件logging.path=/spring/boot
- 磁盘根路径下创建 /spring/boot/spring.log日志文件,spring.log是默认文件名logging.pattern.console=
logging.pattern.file=
- 设置日志输出格式
4.3 日志配置文件放在类路径下可以使用自定义的日志
logback :
logback.xml logback-spring.xml
log4j2 :
log4j2.xml log4j2-spring.xml
jul:
logging.properties
5 Profile
5.1 多配置文件
5.2 yml文档块
---
在yml 中可以充当文档块将多个文档分割,每一块用不同的配置
5.3 激活指定的profile
6 SpringBoot的启动原理 运行流程 自动配置原理
启动原理
创建SpringApplication对象
1.扫描类路径下META-INF/spring.factories文件寻找org.springframework.context.ApplicationContextInitializer
对应的类,并保存起来2.扫描类路径下META-INF/spring.factories文件寻找org.springframework.context.ApplicationListener对应的类
并保存3.判断传入的配置类,哪一个有主方法,哪个就是主配置类(SpringBoot配置类在启动时可以传多个)
运行run方法
1.获取SpringApplicationRunListeners :扫描类路径下META-INF/spring.factories文件寻找org.springframework.boot.SpringApplicationRunListener并逐个调用starting方法
2.使用ApplicationArguments封装命令行参数
3.创建和配置环境
4.创建和配置环境完成后SpringApplicationRunListeners逐个调用envermentPrepared方法,环境准备完成
5.打印banner图标
6.创建IOC容器,会判断是创建web的容器还是普通类型的容器
7.准备上下文环境
8.回调之前保存的所有ApplicationContextInitializer对象的initialize方法
9.回调所有SpringApplicationRunListener的contextPrepared方法
10.所有配置都完成后,回调所有SpringApplicationRunListener的contextLoaded方法, 然后刷新IOC容器(扫描配置文件配置类,创建对象等。如果是web应用还会创建嵌入式的tomcat)
11.从容器中获取所有的ApplicationRunner和CommandLineRunner进行回调
12.回调所有SpringApplicationRunListener的finish方法,启动完成