SpringBoot - 启动原理

1,@SpringBootApplication注解解析

1)定义一个类为Configuration类,并且开启EnableAutoConfiguration自动配置以及ComponentScan包扫描。等效于@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解。
2)@Configuration
JavaConfig 形式的IOC容器配置类(class中声明多个bean方法,运行时经spring容器处理生成bean对象)。等效于 ...;@Bean等效于...的ref引用等效于@Bean方法的调用。
3)与Configuration相关注解:
1.@ImportResource 引入额外的xml文件。

image.png

2.@Import 引入额外的@Configuration修饰类。等效于
SpringBoot - 启动原理_第1张图片
image.png

4)@ComponentScan
自动扫描和加载组件。 等效于,可以使用basePackages指定扫描的包,默认扫描本类所在的package。扫描被@Component、@Repository、@Service等注解的类,将bean定义加载到ioc容器中。
SpringBoot - 启动原理_第2张图片
image.png

5)@EnableAutoConfiguration
核心@Import(AutoConfigurationImportSelector.class),借助@Import,将收集和注册特定场景相关的bean定义,加载bean到ioc容器中。
收集需要导入的配置类
SpringBoot - 启动原理_第3张图片
image.png

借助SpringFactoriesLoader, 从指定配置文件(META-INF/spring.factories)加载配置。
从classpath下搜索META-INF/spring.factories配置文件,将Key为:org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置项导入。
SpringBoot - 启动原理_第4张图片
image.png

SpringBoot - 启动原理_第5张图片
image.png

启动过程中会解析对应类配置信息,生成BeanDefinition,并加载到IOC容器的List中。
SpringBoot - 启动原理_第6张图片
image.png

2,SpringApplication执行流程

1)ApplicationContextInitializer和ApplicationListener初始化

SpringBoot - 启动原理_第7张图片
image.png

从MATA-INF/spring.factories获取类的全限定名,反射实例化。
SpringBoot - 启动原理_第8张图片
image.png

2)run方法,获取 classpath下MATA-INF/spring.factories中所有SpringApplicationRunListener,作为ApplicationStartingEvent发布
SpringBoot - 启动原理_第9张图片
image.png

SpringBoot - 启动原理_第10张图片
image.png

SpringBoot - 启动原理_第11张图片
image.png

3)核心创建IOC容器
SpringBoot - 启动原理_第12张图片
image.png

4)启动WebServer服务器
SpringApplication#refreshContext(context); -> 父类AbstractApplicationContext#refresh()方法 -> onRefresh();方法 -> 子类ServletWebServerApplicationContext#onRefresh() -> createWebServer()
SpringBoot - 启动原理_第13张图片
image.png

5)listeners.started(context);
SpringBoot - 启动原理_第14张图片
image.png

6)执行容器初始化,refreshContext(context)
SpringBoot - 启动原理_第15张图片
image.png

你可能感兴趣的:(SpringBoot - 启动原理)