Java框架-SpringBoot

Spring Boot

  • SpringBoot是spring系列框架的一个整合项目,通过提供各种启动器简化了繁重的配置,约定优先于配置,从开发到编译打包部署提供一套便捷的操作入口。

核心配置文件

  • application文件,springboot应用启动时加载
  • bootstrap文件,启动引导配置文件,在启动springcloud项目时被加载,加载顺序在application之前并且不会被application覆盖

核心注解

  • 核心注解: @SpringBootApplication
  • 由三个注解组成:
    • @SpringBootConfiguration: 注解启动类也是一个bean
    • @EnableAutoConfiguration: 自动配置注解,该注解会导入众多框架或者约定的配置
    • @CompontentScan: 项目bean扫描注解、开发者自己写的bean会自动导入到spring中

开启 Spring Boot 特性

  • 使用springboot-parent作为父项目
  • 导入springboot-dependences

运行 Spring Boot 方式

  • 直接通过main方法运行
  • maven插件运行
  • 打包到tomcat运行

Spring Boot 自动配置原理

  • 主要通过核心注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass直注解
  • 首先springboot使用java配置为各个框架约定定义了运行所需的配置,然后springboot项目启动时,会加载导入所有的配置类,接着在加载的过程中通过 @Conditional注解 根据条件加载所需要的配置。整理流程下来就是约定所有配置然后按需加载。
  • 详细加载过程:
    • 1、ConfigFileListener监听spring启动事件,加载配置文件;
    • 2、main方法类通过注解的ComponentScan加载预定java配置类,此时根据condititional条件加载;
    • 3、是否是约定的java配置写在jar包中的spring.factories中。
  • 1、环境准备阶段
    • 创建Environment对象,通过listener监听器的方式发布环境准备事件,在监听器中推测加载配置文件
    • 创建spring容器对象,从这时候开始,初始化工作就交由spring容器完成
    • 容器加载主要依据springboot的核心注解,SpringBootApplication,它由其他三个组成,负责将自己标志为配置类的SpringBootConfiguration,负责导入各个框架自动配置类的EnableAutoConfiguration,负责扫描其他bean的ComponentScan
    • 这三个注解在容器初始化话过程会从springboot中推测加载相应的配置bean,以及开发者定义的bean,这就是大概的加载流程
    • springcloud的配置加载也是通过先listener的方式加载,在listener中创建父级上下文来加载配置中心的配置文件,然后再spring容器初始化前合并到environment。

Spring Boot 的目录结构

  • springBoot打包插件生成的jar包和maven方法jar插件生成有区别
  • springboot打包插件生成的jar统一使用JarLauncher作为启动main-class,项目相关代码资源文件放在boot-inf文件夹中,包括开发者编写的class、依赖jar包、静态资源
  • 由于JDK默认用于加载应用的AppClassLoader只能从jar的根目录开始加载class文件,并且也不支持jar in jar这种格式。SpringBoot实现支持jar in jar中的URLStreamHandler子类,和并以此为基础实现LaunchedURLClassLoader类加载器。

Spring Boot 启动运行拓展

  • 实现CommandLineRunner接口
  • 实现ApplicationRunner接口
  • 监听启动事件

SpringBoot 实现热部署

  • Spring Loaded、Spring-boot-devtools

springboot的启动流程

1、准备环境:推断servlet还是reactive、初始化启动事件发布、配置文件加载、log配置加载【查找ApplicationContextInitializer、ApplicationListener、SpringApplicationRunListener(启动事件发布器)】 2、创建容器:无参数构造器 3、初始化容器:设置环境Environment、提前实例化ConversionService、springCloud项目则回先初始化父容器(bootstrap配置) 4、刷新容器:创建bean 5、执行CommandlineRunner、ApplicationRunner

配置文件加载顺序

  1. classpath的bootstrap.yml
  2. 本地文件的bootstrap.yml
  3. classpath的application.yml
  4. 本地文件的application.yml
  5. 配置中心的{spring.application.name}.yml
  6. 配置中心的{spring.application.name}-{profile}.yml

后加载的覆盖先加载的