SpringBoot配置和启动

本文最后更新于 2022年5月24日

1.内部配置加载顺序:

加载规则

  • 加载顺序和优先级与配置文件所在路径有关
  • 优先级高的配置会覆盖优先级低的配置,配置文件会全部加载,遇到相同的配置高优先级覆盖低优先级
  • 命令行参数 –spring.config.location 自定义配置文件路径,可以与项目现有配置共存

优先级从高到低为

  1. /config
  2. /(根目录)
  3. classpath:/config
  4. classpath:/

2.外部配置加载顺序

相同配置高优先级覆盖低优先级,不同配置互补,优先级从高到低为

  1. 命令行参数
  2. jar包 外部的application.props/yml 带有spring.profile
  3. jar包 内部的application.props/yml 带有spring.profile
  4. jar包 外部的application.props/yml 不带有spring.profile
  5. 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

      不带-spring后缀的,直接被日志框架识别  
      带后缀的不被日志框架加载,而由spring boot加载,可是使用spring profile功能,指定某个配置在某个环境生效
    

5 Profile

5.1 多配置文件

application-{profile}.properties

5.2 yml文档块

---在yml 中可以充当文档块将多个文档分割,每一块用不同的配置

5.3 激活指定的profile

配置文件指定
spring.profiles.active=dev

命令行参数
--spring.profiles.active=dev

虚拟机参数
-Dspring.profiles.active=dev

6 SpringBoot的启动原理 运行流程 自动配置原理

启动原理

  1. 创建SpringApplication对象

    1.扫描类路径下META-INF/spring.factories文件寻找org.springframework.context.ApplicationContextInitializer
    对应的类,并保存起来

    2.扫描类路径下META-INF/spring.factories文件寻找org.springframework.context.ApplicationListener对应的类
    并保存

    3.判断传入的配置类,哪一个有主方法,哪个就是主配置类(SpringBoot配置类在启动时可以传多个)

  2. 运行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方法,启动完成


SpringBoot配置和启动
https://blog.liuzijian.com/post/3d8e6590-2c41-4f4d-a933-3f57d78ac619.html
作者
Liu Zijian
发布于
2021年5月24日
更新于
2022年5月24日
许可协议