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
配置文件加载顺序
- classpath的bootstrap.yml
- 本地文件的bootstrap.yml
- classpath的application.yml
- 本地文件的application.yml
- 配置中心的{spring.application.name}.yml
- 配置中心的{spring.application.name}-{profile}.yml
后加载的覆盖先加载的