一、Springboot启动流程?
启动过程涉及两部分,一是创建SpringApplication对象,二是由该对象调用run()
方法。
I、创建SpringApplication对象
- 从main()方法执行SpringApplication的
run()
方法,首先new
一个SpringApplication对象; - 创建对象时,构造函数主要做了4件事,分别是:
(1)webApplicationType
确定应用程序的启动类型:REACTIVE(响应式)、NONE(不嵌入web容器启动)、SERVLET(基于web容器启动);
(2)ApplicationContextInitializer
加载所有的初始化器;
(3)ApplicationListener
加载所有的监听器;
(4)mainApplicationClass
设置当前程序运行的主类;
II、SpringApplication对象调用run()方法
SpringApplicationRunListeners
获取应用监听器,启动监听;ConfigurableEnvironment
加载Springboot配置环境,然后把配置环境environment添加到监听对象中;ConfigurableApplicationContext
加载应用程序上下文,作为run()方法的返回对象;refreshContext(context)
(刷新上下文)创建Spring容器,实现自动配置和Bean的实例化等工作;listeners.started()
发布上下文准备就绪事件,告诉应用程序,已准备好开始工作。
二、Springboot自动装配?
Springboot的核心注解是@SpringbootApplication
,该注解由@SpringbootConfiguration
、@ComponentScan
和@EnableAutoConfiguration
三个注解组成,共同配合完成自动装配。
@SpringbootConfiguration
:负责将启动类标记为配置类;@ComponentScan
:负责启动时扫描配置类所在包及其子包中被标记为Bean的类,由IOC容器注册为Bean;@EnableAutoConfiguration
:自动装配核心注解,其中通过@Import
注解导入了AutoConfigurationImportSelector
类,该类中的selectImports()
方法读取类路径的META-INF/spring.factories
文件中配置的类全名,通过一定规则排除过滤掉不符合要求的,将剩下符合要求的类全名集合返回给IOC容器,实现自动装配。
三、Springboot中的starter是什么?
- overstackflow上有人做过总结:Springboot starter就像是启动器,这个启动器会自动依赖其他组件,一站式获取项目需要的与Spring有关的组件,不需要到处找示例代码或是复制相关依赖。
- 如果在项目中使用Spring+SpringMVC开发时,需要引入Mybatis框架,传统的需要在xml中定义需要的Bean对象,这一过程十分麻烦,而在Springboot中直接添加
mybatis-spring-boot-starter
依赖即可。 - 我认为starter就是一个jar包,写一个
@Configuration
配置类,在其中定义需要的Bean,再在starter包的META-INF/spring.factories
文件中写入该配置类,那么Springboot启动时就会按照约定来加载该配置类;开发者只需要在项目中添加这一starter的依赖,进行相关的属性配置,就可以开始程序开发。 - 官方维护的starter以
spring-boot-starter
为前缀,第三方维护的starter以spring-boot-starter
为后缀。 - starter的工作原理:
(1)Springboot启动时会去依赖的starter包中读取META-INF/spring.factories
文件;
(2)根据spring.factories
文件配置加载AutoConfigure
类;
(3)根据@Conditional
注解的条件,将符合条件的Bean注入IOC容器,进行自动装配。