springboot-启动流程
by shihang.mai
1. 启动流程图
查看springboot2.3.7源码后绘制下图。
springboot启动流程图- main启动,new SpringApplication()构造方法里面
- 判断当前应用程序类型reactive、servlet、none
- 获取所有的ApplicationListener对应的对象
- 获取所有的ApplicationContextInitializer对应的对象
获取的方式:通过传入类名,从spring.factories文件获得所有对应类的全路径,反射得到所有的实例对象返回
- run()。主要创建了环境(environment)、事件监听(listeners)、应用上下文(applicationContext),并基于以上条件,在容器中开始实例化我们需要的Bean(refresh方法实例化bean)
- 其中执行BeanFactoryPostProcessors. invokeBeanFactoryPostProcessors()时做了
自动装配
流程
- 递归获取@SpringBootApplication包含的@Import的类,其中AutoConfigurationImportSelector是自动状态的核心
- 在这个类里面,获取spring.factories中key=org.springframework.boot.autoconfigure.EnableAutoConfiguration所有的自动装配类,再经过过滤得到当前应用需要加载的类.容器启动类ServletWebServerFactoryAutoConfiguration也在这里获取
2. 自动装配
如上图所示中的第11步,其中在执行BeanFactoryPostProcessors时
- @SpringBootApplication注解包含了很多注解,这里会解析该注解,将注解中的@Import包含的类注入
- @Import注入了类AutoConfigurationImportSelector,这个类用于发现spring.factories文件中key=org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的全量需要自动装配的类。然后经过过滤,找到当前应用需要自动装配的类
- 而这些需要自动装配的类,通过BFPP(ConfigurationClassPostProcessor)对它们的注解进行解析,变为BeanDefinition.
- 有BeanDefinition之后,走spring的bean生成流程
3. 内嵌tomcat启动
经过自动装配逻辑,那么会得到WebServer关键类ServletWebServerFactoryAutoConfiguration
在第11步onRefresh()方法中,获取WebServer中,默认是Tomcat,其中Tomcat包含几个组件
- Server
- Service
- Engine
- Connector
在创建Tomcat时会利用关键类LifecycleBase,最一个流程模版,流程是
总流程: init()->start()
流程拆分init(): setStateInternal()->initInternal()->setStateInternal()
流程拆分start(): setStateInternal()->startInternal()->setStateInternal()
流程中各组件的生命周期状态变化如下图
springboot的tomcat组件生命周期4. 总结
-
事件监听器的加载依赖spring.factoires文件对应的类
-
自动装配利用了SpringFactoriesLoader来加载META-INF/spring.factoires文件里所有配置的EnableAutoConfgruation,它会经过exclude和filter等操作,最终确定要装配的类
-
处理@Configuration的核心还是ConfigurationClassPostProcessor,这个类实现了BeanFactoryPostProcessor, 因此当AbstractApplicationContext执行refresh方法里的invokeBeanFactoryPostProcessors(beanFactory)方法时会执行自动装配
-
内嵌Tomcat启动,首先依赖自动装配,然后组装Tomcat各组件,启动Tomcat
5. spring Springboot springCloud
spring是框架,是一套生态,它的扩展性,有定义了很多接口,由用户自行去实现方法,可以使程序更快更安全更容易。spring核心IOC和AOP。spring简化开发,降低开发复杂度,轻量级注入pojo,通过IOC,依赖注入和面向接口实现松耦合,基于AOP声明式编程,面向切面减少样式代码。
spring核心IOC和AOP,spring简化开发,降低开发复杂度
springboot为所有spring开发者更快入门。开箱即用,提供各种默认配置来简化项目配置。内嵌式容器简化web项目。没有冗余代码生成和xml配置的要求。
springboot构建为主,快速启动项目
大型分布式网络服务调用,由springcloud完成,实现分布式。代表着spring的生态。springcloud可以帮助服务之间的发现调用,负载均衡,熔断,监控,分布式通信等,提供一系列API网关。springcloud依赖springboot。springcloud基于http协议有利于异构平台,跨语言;可插拔,基于Rest协议,服务之间调用是弱关联,例如A调B,并非每次都一定是那个具体的B的服务,无状态的服务,并非像长连接,sprincloud轻量级;网络不可靠,例如eureka,开启自我保护模式在网络抖动时。可用性提高稍微降低可靠性。
springcloud协调为主
spring为我们由整个从项目构建应用到大型分布式应用全流程都指定了一系列全方案。spring全家桶。
SpringCloud依赖Springboot,Springboot依赖Spring,Spring才是大哥