1. springboot启动顺序
@SpringBootApplication
- 创建SpringApplication
- 保存一些信息
- 判定当前应用类型ClassUtils servlet
- bootstrappers初始启动器,找spring.factories文件的Bootstrapper
- 去spring.factories文件找ApplicationContextInitializer
- 去spring.factories文件找ApplicationListener应用监听器
- 运行SpringApplication
- StopWatch记录应用启动时间
- 创建引导上下文(Context环境)
- 获取到所有之前创建时的bootstrappers,并挨个执行initializer()
- 让当前应用进入headless模式。java.awt.headless
- 获取所有RunListener 运行监听器
- getSpringFactoriesInstances去找spring.factories找SpringApplicationRunListener
- 遍历SpringApplicationRunListener调用starting
- 以上操作相当于通知所有感兴趣系统正在启动过程的人,项目正在启动
- 保存命令行参数ApplicationArguments
- 准备环境prepareEnvironment
- 创建IOC容器(createApplicationContext())
- 根据项目类型servlet创建容器AnnotationConfigServletWebServerApplicationContext
- 准备IOC容器的基本信息ApplicationContext
- 环境信息
- 后置处理流程
- 应用初始化器applyInitializers
- 遍历所有的ApplicationContextInitializer,并调用initialize()。来对IOC容器初始化扩展
- 遍历所有的ApplicationListener,通知contextPrepare结束
- 所有监听器 调用contextLoad 结束
- refresh刷新IOC容器
- 创建容器中的所有组件(同spring启动)
- afterResresh
- 所有监听器调用started
- 调用所有的runners;callRunners()
- 获取容器中的ApplicationRunner
- 获取容器中的CommandLineRunner
- 合并runner并按@Order排序
- 遍历调用run
- 如果以上有异常,调用listener的failed
- 调用所有监听器的running方法
2. 优点
- 创建独立的spring应用
- 内嵌web服务器
- 自动starter一栏
- 自动配置spring及第三方功能
- 生产级监控和健康检查
- 无代码生成、无需编写xml
- 遵循“习惯优于配置”的原则,使用Spring Boot只需要很少的配置,大部分的时候我们直接使用默认的配置即可;
3.热部署
修改的是.java文件,即使点一下编译,将.class文件修改。但是IOC已经初始化完成,该.class文件已经加载到 JVM 中了。而且 JVM 是懒加载的,方法区中的 class 正常情况下是不会写在的。
如果是自定义类加载器,class 就可以卸载
在springboot 里可以直接依赖 devtools包就可以实现热部署了。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
底层实现:
文件监听:监听某一个路径下的文件 -> 使用循环比对(死循环比 大小、修改日期) -> 如果变了,使用 一个新的自定义加载器重新加载(new MyClassLoader)